我有一个字符串变量,其中包含字母
[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'
有什么办法可以解决这个问题吗?谢谢!
您可以使用
gsubfn
library(gsubfn)
gsubfn(".", list("'" = "", " " = "_"), x)
# [1] "ab_c"
同样,我们也可以使用
mgsub
,它允许用多种模式进行多次替换来搜索
mgsub::mgsub(x, c("'", " "), c("", "_"))
#[1] "ab_c"
我很喜欢
%<>%
包中的 %>%
和 magrittr
运算符提供的语法。
library(magrittr)
x <- "a'b c"
x %<>%
gsub("'", "", .) %>%
gsub(" ", "_", .)
x
##[1] "ab_c"
gusbfn
很棒,但我喜欢链接 %>%
允许。
我会选择库中相当快的函数
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
我知道它有点旧,但很难传递有效的基础 R 解决方案。只需使用管道即可:
test <- "abcegdfk461mnb"
test2 <- gsub("e|4|6","",test)
print(test2)
我认为嵌套的 gsub 可以完成这项工作。
gsub("Find","Replace",gsub("Find","Replace",X))
我也会选择
magrittr
和/或 dplyr
解决方案。但是,我不喜欢创建对象的新副本,特别是如果它位于函数中并且可以便宜地返回。
即
return(
catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue
Fish', .)
)
...等等。
gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it
尝试替换列中的多文本字符:
df$TYPE <- str_replace_all(df$TYPE, c("test" = "new_test", "G" = "N", "T" = "W"))
我使用这个函数,如果替换为空,它还允许省略替换的参数:
s=function(x,...,ignore.case=F,perl=F,fixed=F,useBytes=F){
a=match.call(expand.dots=F)$...
l=length(a)
for(i in seq(1,l,2))x=gsub(a[[i]],if(i==l)""else a[[i+1]],x,ignore.case=ignore.case,perl=perl,fixed=fixed,useBytes=useBytes)
x
}
> s("aa bb cc","aa","dd","bb")
[1] "dd cc"
您收到错误
'old' is longer than 'new'
,因为 '
的长度为 2,而 _
的长度为 1。如果您添加另一个 _
来匹配空格和 old
的长度,那么您的代码将有效:
chartr("' ", "__", "a'b c")
#[1] "a_b_c"