在 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
包中的 %<>%
和 %>%
运算符提供的语法。
library(magrittr)
x <- "a'b c"
x %<>%
gsub("'", "", .) %>%
gsub(" ", "_", .)
x
##[1] "ab_c"
gusbfn
很棒,但我喜欢 %>%
允许的链接。
【讨论】:
第三个参数“.”是什么意思在 gsub() 中 默认情况下,%>%
左侧的对象管道到右侧的第一个参数。如果 LHS 需要像本例中那样作为第三个参数,则 .
是占位符。有关详细信息,请参阅vignette("magrittr")
。以上是关于在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?的主要内容,如果未能解决你的问题,请参考以下文章