在给定替换列表的情况下,搜索并替换数据框中的元素。

代码:

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:
  • 也想要上面gsubfn中的解决方案和数据框架的
  • 最佳答案

    问题是这些:

  • 点仅匹配一个字符,因此它将不会匹配整个字符串,除非整个字符串具有一个字符,因此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 = ...

    10-04 11:34
    查看更多