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

#r #dataframe

#r #фрейм данных

Вопрос:

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

 # 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) это работает, то as a кратно b . Тем не менее, я пытаюсь просто выбрать все значения из фрейма данных, y которых нет в x , и не понимаю, какую функцию использовать.

Ответ №1:

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

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

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

Комментарии:

1. Спасибо @Chase, я потратил некоторое время, пытаясь выяснить, что такое отрицание %in% оператора, но не смог это выяснить. Этот ответ также полезен, поскольку он аккуратно объединяет данные.

2. @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 . Помогает ли это объяснить ситуацию?

3. Опоздал на вечеринку, но у Hmisc теперь есть функция %nin% , которой нет в. Очень полезно

Ответ №2:

Попробуйте установить функцию разницы 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
  

Ответ №3:

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

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

#   y
# 1 5
# 2 6
  

Комментарии:

1. Это именно то, что я искал, никогда раньше этого не видел, спасибо Джо (работает с dbplyr, т. Е. в удаленном контексте SQL)