在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?

Posted

技术标签:

【中文标题】在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?【英文标题】:Replace multiple strings in one gsub() or chartr() statement in R? 【发布时间】:2016-03-01 05:12:07 【问题描述】:

我有一个包含字母[a-z]、空格[]和撇号[']的字符串变量,例如。 x <- "a'b c" 我想用空白[]替换撇号['],用下划线[_]替换空格[]。

x <- gsub("'", "", x)
x <- gsub(" ", "_", x)

它绝对有效,但是当我有很多条件时,代码变得很难看。因此,我想使用chartr(),但是chartr()不能处理空白,例如。

x <- chartr("' ", "_", x) 
#Error in chartr("' ", "_", "a'b c") : 'old' is longer than 'new'

有什么办法可以解决这个问题吗?谢谢!

【问题讨论】:

你已经用两个 gsub 解决了。如果它看起来太难看,您可以创建自己的包装函数,我认为它“更漂亮”。但是你不能使用chartr,因为“空白”不是字符,而是缺少字符。 【参考方案1】:

试试这个替换列中的多文本字符:

df$TYPE <- str_replace_all(df$TYPE, c("test" = "new_test", "G" = "N", "T" = "W"))

【讨论】:

当你编辑感谢它也请标记投票。【参考方案2】:

我知道它有点老了,但很难传递一个有效的基础 R 解决方案。只需使用管道:

test <- "abcegdfk461mnb"
test2 <- gsub("e|4|6","",test)
print(test2)

【讨论】:

【参考方案3】:

我会使用库中相当快的函数stri_replace_all_fixed(stringi):

library(stringi)    
stri_replace_all_fixed("a'b c", pattern = c("'", " "), replacement = c("", "_"), vectorize_all = FALSE)

这是一个考虑了大多数其他建议解决方案的基准:

library(stringi)
library(microbenchmark)
library(gsubfn)
library(mgsub)
library(magrittr)
library(dplyr)

x_gsubfn <-
x_mgsub <-
x_nested_gsub <-
x_magrittr <-
x_stringi <- "a'b c"

microbenchmark("gsubfn" =  gsubfn(".", list("'" = "", " " = "_"), x_gsubfn) ,
               "mgsub" =  mgsub::mgsub(x_mgsub, c("'", " "), c("", "_")) ,
               "nested_gsub" =  gsub("Find", "Replace", gsub("Find","Replace", x_nested_gsub)) ,
               "magrittr" =  x_magrittr %<>% gsub("'", "", .) %>% gsub(" ", "_", .) ,
               "stringi" =  stri_replace_all_fixed(x_stringi, pattern = c("'", " "), replacement = c("", "_"), vectorize_all = FALSE) 
               )

Unit: microseconds
        expr     min       lq      mean   median       uq     max neval
      gsubfn 458.217 482.3130 519.12820 513.3215 538.0100 715.371   100
       mgsub 180.521 200.8650 221.20423 216.0730 231.6755 460.587   100
 nested_gsub  14.615  15.9980  17.92178  17.7760  18.7630  40.687   100
    magrittr 113.765 133.7125 148.48202 142.9950 153.0680 296.261   100
     stringi   3.950   7.7030   8.41780   8.2960   9.0860  26.071   100

【讨论】:

【参考方案4】:

您可以使用gsubfn

library(gsubfn)
gsubfn(".", list("'" = "", " " = "_"), x)
# [1] "ab_c"

同样,我们也可以使用mgsub,它允许使用多个模式进行多次替换来搜索

mgsub::mgsub(x, c("'", " "), c("", "_"))
#[1] "ab_c"

【讨论】:

如何才能调用替换文本中的旧文本(例如,常规 gsub 的 do |word| 操作)? @Guest2819 我想我不明白。最好创建一个新问题来显示示例和预期输出。【参考方案5】:

我认为嵌套的 gsub 可以完成这项工作。

gsub("Find","Replace",gsub("Find","Replace",X))

【讨论】:

【参考方案6】:

我也会选择magrittr 和/或dplyr 解决方案。但是,我不喜欢创建对象的新副本,特别是如果它在函数中并且可以廉价返回。

return(
  catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue 
    Fish', .)
)

...等等。

【讨论】:

【参考方案7】:
gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it

【讨论】:

【参考方案8】:

我喜欢 magrittr 包中的 %&lt;&gt;%%&gt;% 运算符提供的语法。

library(magrittr)

x <- "a'b c"

x %<>%
  gsub("'", "", .) %>%
  gsub(" ", "_", .) 
x
##[1] "ab_c"

gusbfn 很棒,但我喜欢 %&gt;% 允许的链接。

【讨论】:

第三个参数“.”是什么意思在 gsub() 中 默认情况下,%&gt;% 左侧的对象管道到右侧的第一个参数。如果 LHS 需要像本例中那样作为第三个参数,则 . 是占位符。有关详细信息,请参阅vignette("magrittr")

以上是关于在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

R 中的 gsub() 没有替换 '.' (点)

使用gsub在R中的空格之前提取字符串

替换列名 gsub 中的字符

替换 R 中的单个反斜杠

如何在 R 中使用 gsub 从字符串中删除非数字字符?

R:在一个管道中组合几个 gsub() 函数