在R中将列表替换为向量

4

我需要进行多个替换。我使用gsub。我想知道是否可能做到像我想要将所有的á替换为a,所有的é替换为e:

gsub(c("á","é"),c("a","e"),"ána belén")

使用这个,我遇到了一个错误。

如果不可能的话,有其他的函数可以实现吗?

2个回答

6

是的,chartr存在:

chartr("áé" ,"ae","ána belén")
# [1] "ana belen"

编辑 由于您现在要求一个更通用的函数,可以处理整个单词,下面是我会做的:

rgsub <- function(pattern, replacement, x) {
   ARGS <- Map(c, pattern = pattern, replacement = replacement)
   FUN  <- function(x, y) gsub(y[['pattern']], y[['replacement']], x)
   Reduce(FUN, ARGS, x)
} 

为了展示它能够产生与qdap相同的结果,但速度稍快:
i <- c("cat", "dog", "mouse")
j <- c("lion", "bulldog", "elephant")
k <- c("cat", "dog", "dog", "mouse", "ant", "mouse")

identical(mgsub(i, j, k), rgsub(i, j, k))
# [1] TRUE

library(microbenchmark)

microbenchmark(mgsub(i, j, k), rgsub(i, j, k))
# Unit: microseconds
#            expr    min       lq   median       uq      max neval
#  mgsub(i, j, k) 586.60 608.6920 629.7840 659.2415 1278.973   100
#  rgsub(i, j, k)  81.91  88.9305  97.0165 107.2390  229.835   100

qdap 可能对很多事情都很好,但对于你的特定应用程序来说可能过于复杂。


但是是否有一种类似的方法可以替换单词 -- 匹配多个字符?例如 function(c("cat", "dog", "mouse"), c("lion", "bulldog", "elephant"), c("cat", "dog", "mouse") 并返回 # [1] "lion", "bulldog" "elephant"。 - lawyeR
对于单词,我会选择在for循环中使用gsub。或者像这个答案一样使用Reduce:http://stackoverflow.com/a/25584852/1201032 - flodel
@flodel 在 mgsub 中有一些错误处理,所以我预计它会慢一些。通常安全性会牺牲速度,但最终可以节省时间。 - Tyler Rinker

2
你可以使用 qdap 中的 mgsub
 library(qdap)
 mgsub(c("á","é"),c("a","e"),"ána belén")
 #[1] "ana belen"

此外,替换 单词
 mgsub(c("cat", "dog", "mouse"),c("lion", "bulldog", "elephant"),
                         c("cat", "dog", "dog", "mouse", "ant", "mouse"))
 #[1] "lion"     "bulldog"  "bulldog"  "elephant" "ant"      "elephant"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接