R gsub将y列中的字从x列中删除

R gsub将y列中的字从x列中删除,r,gsub,R,Gsub,我正在尝试使用gsub删除第x列中y列中的单词/文本 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

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

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是否可以这样做?

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

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

gsub(df$x, "", df$y)  #doesn't work because 'df$x' isn't one string
模式参数没有矢量化,但是我们可以使用
mapply
来完成任务

mapply和gsub(bffs)


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

这里有一个使用str\u remove\u 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

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

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

library(qdap)

z<- mgsub(x, "", y) 

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

虽然上面的gsub(paste0)解决方案可以很好地处理非常小的数据集,但我发现它对于大的数据集返回错误


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

df$y您好,谢谢!这是可行的,但它只从同一行中删除x,因此如果y列中的第2行包含“b”,而x列中的第1行包含“b”,则不会删除该行。有解决方案吗?请尝试
gsub(粘贴(df$x,collapse=“|”),“,df$y)
谢谢!这正是我要找的!这是我见过的关于R函数的最好的解释,谢谢!向上投票!
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"