我有一个包含字母[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很精彩,但我喜欢链接%>%允许.
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)