Удалить строки, существующие в другом фрейме данных?

У меня есть два следующих фрейма данных (пример):

df1:

name    profile    type    strand
A       4.5        1       +
B       3.2        1       +
C       5.5        1       +
D       14.0       1       -
E       45.1       1       -
F       32.8       1       -
G       19.9       1       +

df2:

name
A
B
C
G

Я хотел бы удалить строки в df1, для которых df1$name = df2$name получить следующее:

Выход:

name    profile    type    strand
D       14.0       1       -
E       45.1       1       -
F       32.8       1       -

Если бы кто-нибудь мог сказать мне, какой фрагмент кода использовать, это было бы очень полезно, сначала казалось простым, но я все испортил со вчерашнего дня.


person biohazard    schedule 27.06.2013    source источник


Ответы (3)


Вам нужен оператор %in%. Так,

df1[!(df1$name %in% df2$name),]

должен дать вам то, что вы хотите.

  • df1$name %in% df2$name проверяет, находятся ли значения в df1$name в df2$name
  • Оператор ! обращает результат.
person csgillespie    schedule 27.06.2013
comment
Большое спасибо! У вас есть идеи, что я должен сделать, чтобы сделать его симметричным? Я заметил, что df1[!(df1$name %in% df2$name),] и df2[!(df2$name %in% df1$name),] дают разные результаты... - person biohazard; 27.06.2013
comment
Мне это сейчас очень помогло. Не уверен, что смог бы найти оператора %in%. Это не совсем поисковая вещь.. - person snd; 06.11.2015

Иногда это называют анти-соединением:

library(dplyr)
anti_join(df1, df2, by = "name")
person Hugh    schedule 29.12.2016

df1[!(as.character(df1$jobId) %in% as.character(df2$name)), ]

Мне пришлось добавить as.character к моему исполнению, потому что name — это не символ, а фактор. Разве %in% не должно преобразовывать это напрямую?

person user2635283    schedule 28.12.2016