Удалить строки во фрейме данных на основе нескольких столбцов из другого фрейма данных в R

Я хотел бы удалить строки, которые имеют определенные значения для столбцов, которые соответствуют значениям в другом фрейме данных.

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)

Чтобы ты мог стать:

 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

Я пробовал следующее, что не сработало:

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)

Я также попытался просто пометить те, которые следует удалить, чтобы создать подмножество на втором этапе, но это тоже не сработало:

y<-data
y$rm<-ifelse(y$a==x$a & y$b==x$b & y$c==x$c, 1, 0)

Реальные «данные» и «x» намного длиннее, и в данных есть переменное количество строк, которые соответствуют каждой строке в x.


person Maya    schedule 11.08.2015    source источник


Ответы (1)


Мы можем использовать anti_join из dplyr. Он вернет все строки из «данных», которые не соответствуют значениям в «x». Мы указываем переменные, которые необходимо учитывать, в аргументе by.

library(dplyr)
anti_join(data, x, by=c('a', 'b', 'c'))
person akrun    schedule 11.08.2015