替换字符串中的特定字符

Luk*_*uke 251 regex replace r string-substitution gsub

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

以下是我开始的数据:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")
Run Code Online (Sandbox Code Playgroud)

我从第一栏开始; 我想通过删除e's 来生成第二列:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947
Run Code Online (Sandbox Code Playgroud)

And*_*rie 380

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

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

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"
Run Code Online (Sandbox Code Playgroud)

gsub"e"用空字符串替换每个出现的内容"".


请参阅?regexpgsub获取更多帮助.

  • `fixed = TRUE`会使这更快. (13认同)
  • `fixed = TRUE`阻止R使用正则表达式,这允许更灵活的模式匹配,但需要时间来计算.如果只需要删除单个常量字符串"e",则不需要它们. (5认同)
  • @RichScriven你能不能详细说明原因? (4认同)
  • `sub("e", "", group)` 会得到相同的结果吗? (2认同)

Dir*_*tel 45

正则表达式是你的朋友:

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
Run Code Online (Sandbox Code Playgroud)

现在使用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> 
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我可能会说"那些不了解基本功能的人注定要取而代之".除了增加源文件中下划线的数量之外,stringr究竟在这里获得了什么? (26认同)
  • @dickoa:`str_replace`包装`sub`,所以它只会替换第一次出现的模式.如果你想要与`gsub`相同的行为,你需要使用`str_replace_all`. (16认同)
  • "**stringr是一组简单的包装器,使得R的字符串函数更加一致,更简单,更易于使用**"来自该软件包的作者.所以如果你说的是真的(许多下划线要包装基本函数......)没有理由让这个包存在(免责声明:我主要使用基本的正则表达式函数,但我知道它们对于新用户来说可能很难... ) (8认同)
  • 另外......`require(stringr); group $ groupNoE < - str_replace(group $ group,"e","")` (3认同)

Meg*_*ron 23

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

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))
Run Code Online (Sandbox Code Playgroud)

1)使用 gsub

group$group.no.e <- gsub("e", "", group$group)
Run Code Online (Sandbox Code Playgroud)

2)使用stringr包装

group$group.no.e <- str_replace_all(group$group, "e", "")
Run Code Online (Sandbox Code Playgroud)

两者都会产生欲望输出:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947
Run Code Online (Sandbox Code Playgroud)

  • 在其他两个答案中都提到过`gsub()` (5认同)
  • 当时你必须阅读整个页面,包括注释,以了解stringr的语法,我的首选方法,因为它主要在评论中讨论.这个解决方案可以快速提供两种选择,这就是我提供它的原因.我的希望是帮助其他用户进行过滤,就像我刚接触到R时一样.我在找到stringr之前一直在与gsub进行斗争*因为*在一个高度赞成的答案中没有提到它.同样,目标不是收集upvotes,而是尝试帮助新的R用户. (2认同)

MER*_*ose 7

使用stringi包:

require(stringi)

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


Ale*_*der 6

如果要替换字符串中的某些字符,则无需从字符串向量创建数据框.正则表达式是它的不错选择,因为@Andrie和@Dirk Eddelbuettel已经提到过它.

请注意,如果要替换特殊字符(如点),则应使用完整的正则表达式语法,如下例所示:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)
Run Code Online (Sandbox Code Playgroud)

这将产生

[1] "Czech Republic" "New Zealand"    "Great Britain" 
Run Code Online (Sandbox Code Playgroud)