2017-01-22 3 views
1

У меня 2 кадров данных (А и В) в следующей структуре:Проверка пары элементов между двумя кадрами данных

A:

projectID offerID 
    20   12 
    20   17 
    32   12 
    32   25 

B:

projectID offerID 
    20   12 
    20   17 
    32   12 

и I 'd хотел бы проверить пары, которые находятся в A, но не в B. Поэтому в моем примере я хотел бы получить новый df, который содержит пары, которые находятся в A, но не в B:

projectID offerID 
    32   25 

Я пробовал некоторые варианты; например:

APairs <- A %>% group_by(projectID, offerID) 
BPairs <- B %>% group_by(projectID, offerID) 

!(APairs %in% BPairs) 

, но я получаю True/False результат, который я не могу понять/проверить по моим данным.

Ваша помощь будет оценена!

ответ

2

Мы можем использовать anti_join из dplyr

library(dplyr) 
anti_join(A, B) 
# projectID offerID 
#1  32  25 

Если есть большее количество столбцов, указать by вариант

anti_join(A, B, by = c("projectID", "offerID")) 
# projectID offerID 
#1  32  25 
3
library(data.table) 
setkey(setDT(A)) 
setkey(setDT(B)) 
A[!B]    # A[B] is similar to merge() so perform the opposite using ! 
# projectID offerID 
#1:  32  25 

#incase there are extra columns in any of the table, the specify the common columns in a vector 
common.col <- c("projectID", "offerID") 
setkeyv(setDT(A), cols = common.col) 
setkeyv(setDT(B), cols = common.col) 
A[!B] 
+0

По какой-то причине это не работает. вы думаете, это потому, что у меня больше столбцов в одном из кадров данных? – staove7

+0

@ staove7 Я редактировал на основе вашего нового запроса дополнительные столбцы! дайте мне знать, как это происходит! –

+0

это говорит мне, что x не является data.table .. :( – staove7

4

base В R:

#define the key columns in the case of different structure between A and B 
cols<-c("projectID","offerID") 
A[!do.call(paste,A[cols]) %in% do.call(paste,B[cols]),] 
# projectID offerID 
#4  32  25