#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)