Заменить определенные символы в строках


262

Я хотел бы удалить определенные символы из строк в векторе, аналогично функции поиска и замены в Excel.

Вот данные, с которых я начинаю:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Я начинаю только с первого столбца; Я хочу создать второй столбец, удалив e:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Ответы:


399

С регулярным выражением и функцией gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Что gsubделает здесь , чтобы заменить каждое вхождение "e"с пустой строкой "".


Смотрите ?regexpили gsubдля получения дополнительной помощи.


15
fixed = TRUEсделает это быстрее.
Rich Scriven

4
@RichScriven, не могли бы вы вкратце объяснить, почему?
застеклено

6
fixed=TRUEне позволяет R использовать регулярные выражения, которые позволяют более гибко сопоставлять шаблоны, но требуют времени для вычислений. Если все, что нужно, это удалить одну постоянную строку «е», они не нужны.
mm689

Будет ли sub("e", "", group)держать тот же результат?
Матеус Сантана

просто заменит первый eнайденный в каждом элементе
sindri_baldur

47

Регулярные выражения ваших друзей:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Теперь используйте gsub()самый простой шаблон замены: empty string:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Также ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
Дикоа

26
Ну, я мог бы посмеяться над тем, что «Те, кто не понимает базовых функций, обречены на их замену». Что именно здесь делает Стрингер, помимо увеличения количества подчеркиваний в вашем исходном файле?
Дирк Эддельбюттель

8
« stringr - это набор простых оболочек, которые делают строковые функции R более согласованными, простыми и удобными в использовании » от автора пакета. Так что, если то, что вы говорите, верно (многие подчеркивают, чтобы обернуть базовые функции ...), нет никаких оснований для существования этого пакета (отказ от ответственности: я в основном использую функции базовых регулярных выражений, но я знаю, что они могут быть трудными для новых пользователей ... )
dickoa

17
@dickoa: str_replaceобертывания sub, поэтому он заменит только первое вхождение шаблона. Вам нужно будет использовать, str_replace_allесли вы хотите такое же поведение, как gsub.
Джошуа Ульрих

24

Обобщая 2 способа замены строк:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Использование gsub

group$group.no.e <- gsub("e", "", group$group)

2) Используйте stringrпакет

group$group.no.e <- str_replace_all(group$group, "e", "")

Оба будут производить вывод желания:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
В то время вам приходилось читать всю страницу, включая комментарии, чтобы узнать синтаксис для stringr, моего предпочтительного метода, так как он в основном обсуждался в комментариях. Это решение быстро представляет оба варианта, поэтому я и предложил его. Я надеялся помочь другим пользователям отфильтровать то же самое, что и я, когда был новичком в R. Я боролся с gsub, прежде чем нашел stringr, потому что об этом не было сказано в ответе с большим количеством голосов. Опять же, цель состоит не в том, чтобы собрать голоса, а попытаться выручить новых пользователей R.
Мегатрон

Если вы найдете информацию в других ответах / комментариях, которую вы найдете полезной и хотите преобразовать в ответ, вы можете по крайней мере предоставить некоторую атрибуцию, чтобы показать, откуда вы получили информацию / сделать ответ в Comminuty Wiki, вместо того, чтобы просто сделать его как твой собственный.
Давид Аренбург

Спасибо - буду иметь в виду на следующий раз. Никогда раньше не создавал вики сообщества, поэтому не знал, что это вариант.
Мегатрон

1
Вариант 2 прекрасно работает при применении к столбцу данных во фрейме данных без указания всех значений в столбце. Очевидно, вариант 1 является повторением, но вариант 2 работает очень хорошо и заслуживает одобрения за добавленную функциональность.
Phil_T

6

Вам не нужно создавать фрейм данных из вектора строк, если вы хотите заменить некоторые символы в нем. Регулярные выражения - хороший выбор для этого, поскольку это уже упоминалось @Andrie и @Dirk Eddelbuettel.

Обратите внимание: если вы хотите заменить специальные символы, такие как точки, вы должны использовать полный синтаксис регулярного выражения, как показано в примере ниже:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

это будет производить

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Вы можете просто убежать от них, но вы также должны убежать от побега, потому что он в кавычках:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Используйте пакет stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.