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


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.