R gsub从列x中的单词中删除第y列中的单词

时间:2016-12-08 21:20:48

标签: r gsub

我尝试使用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

因此,应从列y中删除列x中的所有单词/字母。这可能与gsub一起使用吗?

3 个答案:

答案 0 :(得分:2)

通常gsub有三个参数:1)模式,2)替换和3)向量来替换值。

模式必须是单个字符串。替换也一样。对多个值开放的函数的唯一部分是向量。我们称之为矢量化。

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

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

mapply和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'直到它等于其他人的长度。

答案 1 :(得分:0)

这是使用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

enter image description here

答案 2 :(得分:0)

我在一个非常大的数据集上尝试了以上答案,并发现此代码最有效:

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)软件。否则,由于它是基于Java的,因此在安装/尝试运行qdap软件包时会遇到错误。