基于 R 中另一个数据框中的多列删除数据框中的行

May*_*aya 4 r subset dataframe

我想删除具有与另一个数据框中的值匹配的列的特定值的行。

a<-c(1,1,2,2,2,4,5,5,5,5)
b<-c(10,10,22,30,30,30,40,40,40,40)
c<-c(1,2,1,2,2,2,2,1,1,2)
d<-rnorm(1:10)
data<-data.frame(a,b,c,d)

a<-c(2,5)
b<-c(30,40)
c<-c(2,1)
x<-data.frame(a,b,c)
Run Code Online (Sandbox Code Playgroud)

这样 y 就可以变成:

 a  b c          d
 1 10 1 -0.2509255
 1 10 2  0.4142277
 2 22 1 -0.1340514
 4 30 2 -1.5372009
 5 40 2  1.9001932
 5 40 2 -1.2825212
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但没有用:

y<-data[!data$a==a & !data$b==b & !data$c==c,] 

y<-subset(data, !data$a==x$a & !data$b==x$b & !data$c==x$c)
Run Code Online (Sandbox Code Playgroud)

我还尝试仅标记应该删除的那些,以便在第二步中进行子集化,但这也不起作用:

y<-data
y$rm<-ifelse(y$a==x$a & y$b==x$b & y$c==x$c, 1, 0)
Run Code Online (Sandbox Code Playgroud)

真正的“数据”和“x”要长得多,并且与 x 中的每一行匹配的数据中的行数是可变的。

akr*_*run 5

我们可以使用anti_joindplyr. 它将返回 'data' 中与 'x' 中的值不匹配的所有行。我们指定要在by参数中考虑的变量。

library(dplyr)
anti_join(data, x, by=c('a', 'b', 'c'))
Run Code Online (Sandbox Code Playgroud)