Как я могу выбрать строки из фрейма данных, которые не совпадают?

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

# make data frame 
a <- data.frame( x =  c(1,2,3,4)) 
b <- data.frame( y =  c(1,2,3,4,5,6))

# select only values from b that are not in 'a'
# attempt 1: 
results1 <- b$y[ !a$x ]

# attempt 2:  
results2 <- b[b$y != a$x,]

Если a = c(1,2,3) это работает, так как a кратно b. Однако я пытаюсь просто выбрать все значения из фрейма данных y, которых нет в x, и не понимаю, какую функцию использовать.


person djq    schedule 28.04.2011    source источник


Ответы (3)


Если я правильно понимаю, вам нужно отрицание оператора %in%. Что-то вроде этого должно работать:

subset(b, !(y %in% a$x))

> subset(b, !(y %in% a$x))
  y
5 5
6 6
person Chase    schedule 28.04.2011
comment
Спасибо @Chase, я потратил некоторое время, пытаясь понять, что такое отрицание оператора %in%, но не смог понять. Этот ответ также полезен, поскольку он аккуратно подмножает данные. - person djq; 28.04.2011
comment
@celenius - оператор %in% возвращает логический вектор, который сообщает нам, есть ли совпадение между первым оператором и вторым. (b$y %in% a$x) [1] TRUE TRUE TRUE TRUE FALSE FALSE. ! подразумевает отрицание, поэтому будет возвращено !(b$y %in% a$x)[1] FALSE FALSE FALSE FALSE TRUE TRUE . Это помогает объяснить вещи? - person Chase; 28.04.2011
comment
Поздно на вечеринку, но теперь у Hmisc есть функция %nin%, которой нет. Очень полезно - person morgan121; 19.12.2019

Попробуйте функцию установки разницы setdiff. Таким образом, вы бы

results1 = setdiff(a$x, b$y)   # elements in a$x NOT in b$y
results2 = setdiff(b$y, a$x)   # elements in b$y NOT in a$x
person Ramnath    schedule 28.04.2011

Вы также можете использовать dplyr для этой задачи. Чтобы найти то, что находится в b, но не в a:

library(dplyr)    
anti_join(b, a, by = c("y" = "x"))

#   y
# 1 5
# 2 6
person Joe    schedule 15.11.2018
comment
Это именно то, что я искал, никогда раньше этого не видел, спасибо, Джо (работает с dbplyr, т.е. в удаленном контексте SQL) - person yeahman269; 19.04.2021