2015-05-10 5 views
4

Я хотел бы удалить последний символ переменной. Мне было интересно, можно ли выбрать позицию с gsub и удалить символ в этой конкретной позиции.R - gsub определенный символ определенной позиции

В этом примере я хочу удалить последнюю цифру в конце, после E, для моих 4 переменных.

variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4') 
gsub(pattern = '[[:xdigit:]]{8}.', replacement = '', x = variables) 

Я думал, что мы могли бы использовать команду

{} 

для того, чтобы выбрать конкретную позицию.

ответ

1

Вы можете сделать это, захватив все символы, но последние:

variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4') 
gsub('^(.*).$', '\\1', variables) 

Пояснение:

  • ^ - начало строки
  • (.*) - Все символы, кроме символа новой строки до
  • .$ - последний символ (захваченный с .) до конца строки ($).

Таким образом, это регулярное выражение хорошо использовать, если вы планируете, чтобы удалить символ окончательного и строка не содержит символ новой строки.

См demo

Выход:

[1] "B10243E" "B10243E" "B10243E" "B10243E" 

Чтобы заменить только 8-й символ (здесь приведен пример, где я добавил T в конце каждого пункта):

variables = c('B10247E1T', 'B10243E2T', 'B10243E3T', 'B10243E4T') 
gsub('^(.{7}).', '\\1', variables) 

Выходной от sample program (не ET в конце каждого элемента, цифра была удалена):

[1] "B10247ET" "B10243ET" "B10243ET" "B10243ET" 
1

Если вы всегда хотите удалить после E вы можете захватить все после него и заменить E

sub("E(.*)", 'E', variables) 
## [1] "B10243E" "B10243E" "B10243E" "B10243E" 

В качестве альтернативы, вы можете рассчитывать 7 символов, используя положительный взгляд назад и удалить все после

sub("(?<=.{7})(.)", "", variables, perl = TRUE) 
## [1] "B10243E" "B10243E" "B10243E" "B10243E" 
+0

большое спасибо! – giacomo

3

Попробуйте любой из них. Первый удаляет последний символ, второй заменяет E и что-то после него на E, третий возвращает первые 7 символов, предположив, что их 8 символов, остальные возвращают первые 7 символов. Все они векторизованы, то есть variables может быть вектором символьных строк, как в вопросе.

sub(".$", "", variables) 

sub("E.*", "E", variables) 

sub("^(.{7}).", "\\1", variables) 

sub("^(.{7}).*", "\\1", variables) 

substr(variables, 1, 7) 

substring(variables, 1, 7) 

Вот визуализация регулярного выражения в третьем растворе:

^(.{7}). 

Regular expression visualization

Debuggex Demo

и есть визуализация регулярного выражения в четвертом растворе :

^(.{7}).* 

Regular expression visualization

Debuggex Demo

+0

большое спасибо за подробную информацию – giacomo

+0

Супер классный инструмент. – MichaelChirico

0
library(stringr) 
str_sub("your String", 1, -2) 

может быть медленнее, чем другие, но намного легче читать.

Смежные вопросы