在给定替换列表的情况下,搜索并替换数据框中的元素。
代码:
testing123tmp <- data.frame(x=c("it's", "not", "working"))
testing123tmp$x <- as.character(testing123tmp$x)
tmp <- list("it's" = "hey", "working"="dead")
apply(testing123tmp,2,function(x) gsubfn('.', tmp, x))
预期输出:
x
[1,] hey
[2,] not
[3,] dead
我当前的输出:
x
[1,] "it's"
[2,] "not"
[3,] "working"
一直在寻找宪章和gsub中的可能解决方案,但是由于这种操作需要多个gsub,因此希望简单(短编码)。另外,我的变量tmp可以缩放为多对替换,从而:
tmp <- list("it's" = "hey",
"working"="dead",
"other" = "other1",
.. = .. ,
.. = .. ,
.. = .. )
编辑/更新#1:
最佳答案
问题是这些:
tmp
中的任何名称都不会匹配。使用".*"
匹配整个字符串。如果您想匹配单词,即x
的每个组件中可能有几个单词用空格隔开,因此例如x
的一个组件可能是"it's not"
,我们仍然想匹配it's
然后使用"\\S+"
。人们还可以想象还有其他变体,这提供了涵盖其中许多的框架。 gsubfn
的第三个参数已经可以是 vector ,并且gsubfn
将对其进行迭代,因此不必使用apply
。 (它仍然可以与apply
一起使用,但这是不必要的。)transform
,如下所示(或在gsubfn包中替代使用transform2
)。 x
将自动引用x
数据框中的testing123tmp
列,并且transform
将产生一个新的数据框,而不会覆盖原始数据框。如果要分开使用,请将transform
的结果分配给新名称,或者如果要覆盖testing123tmp
,则将其分配回testing123tmp
。 stringsAsFactors = FALSE
避免生成字符列。testing123tmp <- data.frame(x=c("it's", "not", "working"), stringsAsFactors = FALSE)
因此,我们可以将代码简化为:
transform(testing123tmp, y = gsubfn(".*", tmp, x))
给出以下data.frame:
x y
1 it's hey
2 not not
3 working dead
如果我们想覆盖
x
列而不是保留单独的输入和输出列,则可以在x = ...
语句中使用transform
而不是y = ...
。