搜索和替换在给定的替换的列表的数据帧的元件。
码:
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"
一直在寻找围绕在CHARTR和GSUB可能的解决方案,但想给出简单(短码)的多个GSUB需要这样的操作。另外我的变量TMP可以扩展到很多,对更换这样的:
tmp <- list("it's" = "hey",
"working"="dead",
"other" = "other1",
.. = .. ,
.. = .. ,
.. = .. )
编辑/更新#1:
问题是这些:
tmp
没有名字将永远不会匹配。使用".*"
整个字符串相匹配。如果你想匹配的话,即有可能由空格中x
的各组分分离,使得例如x
的一个组件可能是"it's not"
,我们仍然要匹配,则it's
使用"\\S+"
几个单词。还有其他的变化能够想象,以及由此给一个框架,涵盖了很多。gsubfn
已经可以是一个载体,gsubfn
会遍历它,所以它是没有必要使用apply
。 (它仍然会与apply
工作,但它是不必要的。)transform
如下所示(或交替使用transform2
,同样在gsubfn包)。该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 = ...
。
你可以写
gsubfn(".*", tmp, testing123tmp$x)
# [1] "hey" "not" "dead"
接着
testing123tmp$x <- gsubfn(".*", tmp, testing123tmp$x)
至于你的做法,没有必要apply
作为gsubfn
被矢量超过该参数,而问题是,同时.
和it's
是不同长度的只匹配working
---一个符号。
但是,如果你与另一个词替换一个词,那么就没有必要对正则表达式。例如,
idx <- testing123tmp$x %in% names(tmp)
testing123tmp$x[idx] <- unlist(tmp)[testing123tmp$x[idx]]
应工作得更快。如果任务是更多地参与,那么我想
library(stringr)
str_replace_all(testing123tmp$x, unlist(tmp))
# [1] "hey" "not" "dead"
应该比gsubfn
更强大的,你不需要处理像.*
模式。