【问题标题】:R gsub remove words in column y from words in column xR gsub 从 x 列中的单词中删除 y 列中的单词
【发布时间】:2016-12-08 21:20:47
【问题描述】:

我正在尝试使用 gsub 删除 y 列中 x 列中的单词/文本。

x = c("a","b","c")
y = c("asometext", "some, a b text", "c a text")
df = cbind(x,y)
df = data.frame(df)
df$y = gsub(df$x, "", df$y)

如果我运行上面的代码,它只会删除 x 列第 1 行中的文本,而不是所有行:

> df
  x             y
1 a      sometext
2 b some,  b text
3 c       c  text

我希望最终结果是:

> df
  x             y
1 a      sometext
2 b      some,   text
3 c      text

因此,x 列中的所有单词/字母都应从 y 列中删除。使用 gsub 可以吗?

【问题讨论】:

  • df$y <- mapply(gsub, df$x, "", df$y) 可以工作

标签: r gsub


【解决方案1】:

通常gsub 采用三个参数 1) 模式、2) 替换和 3) 向量来替换值。

模式必须是单个字符串。更换也是如此。函数中唯一对多个值开放的部分是向量。正因为如此,我们称之为矢量化。

gsub(df$x, "", df$y)  #doesn't work because 'df$x' isn't one string

pattern 参数没有向量化,但我们可以使用mapply 来完成任务。

ma​​pply 和 gsub (bffs)

x = c("a","b","c")
y = c("asometext", "some, a b text", "c a text")
repl = ""

#We do
mapply(gsub, x, repl, y)

#On the inside
gsub(x[[1]], repl[[1]], y[[1]])
gsub(x[[2]], repl[[2]], y[[2]])
gsub(x[[3]], repl[[3]], y[[3]])

您可能会问,但我只有一个replrepl[[2]]repl[[3]] 是如何工作的?该函数注意到我们并重复“repl”直到它等于其他的长度。

【讨论】:

  • 您好,谢谢!这可行,但它只会从同一行中删除 x,因此如果 y 列中的第 2 行包含“b”,并且 x 列中的第 1 行包含“b”,那么它将不会被删除。有解决办法吗?
  • 试试gsub(paste(df$x, collapse ="|"), "", df$y)
  • 谢谢!这正是我想要的!
  • 这是我在任何 R 函数上见过的最好的解释,谢谢!赞成!
【解决方案2】:

这是使用 str_remove_all 的解决方案:

library(stringr)    
x  = c("a","b","c")
y  = c("asometext", "some, a b text", "c a text")
df = cbind(x,y)
df = data.frame(df,stringsAsFactors = F)

# creating a format of "[abc]" to use in str_remove_all
comb_a = paste0("[",paste(df$x,collapse = ""),"]")

df$y = sapply(df$y, function(r) str_remove_all(r, comb_a) )
df

【讨论】:

    【解决方案3】:

    我在一个非常大的数据集上尝试了上述答案,发现这段代码效果最好:

    x = c("a","b","c")
    y = c("asometext", "some, a b text", "c a text")
    
    library(qdap)
    
    z<- mgsub(x, "", y) 
    
    

    它给出了所需的解决方案:

    z: "sometext", "some,  text", "  text"
    

    这是因为 mgsub 函数是 gsub 的包装器,它采用搜索词向量和替换向量或单个值,我发现它比 gsub 更强大,尤其是在处理大型数据集时。它完成了 gsub 需要 2-3 行代码来完成的工作。

    虽然上述 gsub(paste0) 解决方案适用于非常小的数据集,但我发现它对于大型数据集返回错误。

    Mac 用户注意事项:在安装 qdap 软件包之前,请确保您的计算机上已预先安装了 java 和 pdk (oracle) 软件。 otw 您在安装/尝试运行 qdap 包时会遇到错误,因为它是基于 java 的。

    【讨论】:

      【解决方案4】:

      这是使用 for 循环实现的一种方法

      output <- y
      for (i in 1:3){
          output <- gsub(pattern = x[i],
                       replacement = "",
                       output)
      }
      print(output)
      

      你会得到的结果:

          print(output)
      [1] "sometext"     "some,   text" "  text"  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-13
        • 2019-09-05
        • 2021-12-29
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多