【问题标题】:Replace specific characters within strings替换字符串中的特定字符
【发布时间】:2012-08-09 19:15:37
【问题描述】:

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

这是我开始的数据:

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

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

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

【问题讨论】:

    标签: r regex replace gsub string-substitution


    【解决方案1】:

    带有正则表达式和函数gsub()

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

    gsub 在这里所做的是将每次出现的"e" 替换为空字符串""


    请参阅?regexpgsub 以获得更多帮助。

    【讨论】:

    • fixed = TRUE 会更快。
    • @RichScriven 您能否简要说明原因?
    • fixed=TRUE 阻止 R 使用正则表达式,这允许更灵活的模式匹配但需要时间来计算。如果只需要删除单个常量字符串“e”,则没有必要。
    • sub("e", "", group) 会保持相同的结果吗?
    • 只会替换它在每个元素中找到的第一个 e
    【解决方案2】:

    正则表达式是你的朋友:

    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> 
    

    【讨论】:

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

    总结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
    

    【讨论】:

    • 当时您必须阅读包括 cmets 在内的整个页面来学习 stringr 的语法,这是我的首选方法,因为它主要在 cmets 中进行了讨论。该解决方案快速提供了这两个选项,这就是我提供它的原因。我的希望是帮助其他用户进行过滤,就像我刚接触 R 时所做的那样。在找到 stringr 因为它没有在高度赞成的答案中提到之前,我一直在努力使用 gsub。同样,目标不是收集赞成票,而是尝试帮助新的 R 用户。
    • 如果您在其他答案/cmets 中找到您认为有用的信息并希望转换为答案,您至少可以提供一些属性以显示您从哪里获得信息/使答案成为社区 Wiki 而不是仅仅将其作为您自己的。
    • 谢谢 - 下次会记住。以前从未制作过社区 wiki,所以不知道这是一种选择。
    • 选项 2 在应用于数据框中的一列数据时效果很好,无需指定列中的所有值。显然,选项 1 是重复的,但选项 2 效果很好,值得为增加的功能投票。
    【解决方案4】:

    使用stringi 包:

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

    【讨论】:

      【解决方案5】:

      如果要替换其中的某些字符,则无需从字符串向量创建数据框。正则表达式是它的好选择,因为@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)
      【解决方案6】:
      > 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" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        相关资源
        最近更新 更多