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

Eri*_*ang 13 string r gsub

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

x <- gsub("'", "", x)
x <- gsub(" ", "_", x)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pet*_*ter 20

我的语法的粉丝%<>%,并%>%从opperators magrittr包提供.

library(magrittr)

x <- "a'b c"

x %<>%
  gsub("'", "", .) %>%
  gsub(" ", "_", .) 
x
##[1] "ab_c"
Run Code Online (Sandbox Code Playgroud)

gusbfn很精彩,但我喜欢链接%>%允许.

  • 默认情况下,`%>%`左侧的对象是*piped*到右侧的第一个参数.如果LHS需要,如本例中的第三个参数,则`.`是占位符.有关详细信息,请参阅`vignette("magrittr")`. (5认同)
  • 第三个参数"是什么意思".在gsub() (2认同)

Ron*_*hah 15

您可以使用 gsubfn

library(gsubfn)
gsubfn(".", list("'" = "", " " = "_"), x)
# [1] "ab_c"
Run Code Online (Sandbox Code Playgroud)


ism*_*gal 14

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

library(stringi)    
stri_replace_all_fixed("a'b c", pattern = c("'", " "), replacement = c("", "_"), vectorize_all = FALSE)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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

gsub("Find","Replace",gsub("Find","Replace",X))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

test <- "abcegdfk461mnb"
test2 <- gsub("e|4|6","",test)
print(test2)
Run Code Online (Sandbox Code Playgroud)

  • @Brad - 不,不是。这并不能回答问题。OP要求用不同的替换来替换多个字符串。上面只有一个用于多个模式的替换字符串。 (2认同)
  • 好点,仍然是不错的代码。许多人不知道可以使用 | 在 gsub 中声明多个子字符串。 (2认同)