gsubfn数据帧上

问题描述 投票:2回答:2

搜索和替换在给定的替换的列表的数据帧的元件。

码:

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:

  • 还希望在上述gsubfn和解决方案数据框
r regex gsubfn
2个回答
4
投票

问题是这些:

  • 该点仅匹配一个字符所以它永远不会匹配整个字符串除非整个字符串有一个字符,因此在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 = ...


2
投票

你可以写

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更强大的,你不需要处理像.*模式。

© www.soinside.com 2019 - 2024. All rights reserved.