替换字符串中的特定字符


262

我想从向量中的字符串中删除特定字符,类似于Excel中的“ 查找和替换”功能。

这是我开始的数据:

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

我从第一列开始。我想通过删除来产生第二列e

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

Answers:


399

具有正则表达式和功能gsub()

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

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

gsub这里要做的是"e"用空字符串替换每次出现的情况""


请参阅?regexpgsub寻求更多帮助。


15
fixed = TRUE会更快。
Rich Scriven

4
@RichScriven您能否简要说明为什么?
2016年

6
fixed=TRUE阻止R使用正则表达式,从而允许更灵活的模式匹配,但需要花费一些时间进行计算。如果只需要除去单个常量字符串“ e”,则不需要它们。
mm689

sub("e", "", group)保持相同的结果吗?
Matheus Santana

只会替换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()最简单的替换模式:空字符串:

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", "")
dickoa 2012年

26
好吧,我可以窃笑“那些不了解基本功能的人注定要替换它们”。除了增加源文件中的下划线数量之外,stringer在这里还能获得什么?
德克·埃德尔布特尔

8
stringr是一组简单的包装,它们使R的字符串函数更一致,更简单且更易于使用 ”,来自包装作者。因此,如果您说的是正确的(很多下划线来包装基本函数...)就没有理由存在此软件包(免责声明:我主要使用基本正则表达式函数,但我知道新用户可能会很难... )
dickoa 2012年

17
@dickoa:str_replacewraps sub,因此它将仅替换模式的第一次出现。str_replace_all如果您想要与相同的行为,则需要使用gsub
约书亚·乌尔里希

24

总结了两种替换字符串的方法:

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
当时,您必须阅读包括注释在内的整个页面,以学习stringer的语法,这是我的首选方法,因为stringer在注释中大多进行了讨论。此解决方案很快提供了两种选择,这就是我提供它的原因。我的希望是像我刚接触R时一样,可以帮助其他用户进行过滤。在找到stringer之前,我与gsub进行了艰苦的尝试,因为在高度支持的答案中并未提及它。同样,目标不是收集投票,​​而是尝试帮助新的R用户。
威震天

如果您在其他答案/评论中找到了有用的信息,并且希望将其转换为答案,则至少可以提供一些归因,以表明您从何处获得信息/将答案制作为Comminuty Wiki,而不仅仅是将其做成你自己。
David Arenburg

谢谢-下次会记住的。以前从未制作过社区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" 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.