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

#r #dataframe #dplyr #data-manipulation

Вопрос:

У меня есть два кадра данных с одинаковыми именами столбцов, примеры ниже.

 gt;dataframe1  Company_name Transaction_Code Sum 1: First 2000 234 2: First 3000 562 3: First 4000 105 4: Second 8888 740 5: Third 9000 325 6: Third 4000 145 7: BBB 1000 28 8: BBB 3535 100  
 gt;dataframe2  Company_name Transaction_Code Sum 1: First 2000 340 2: First 3000 620 3: First 4000 050 4: Second 8888 400 5: Third 9000 250 6: Third 4000 450 7: BBB 1000 27  

Я пытаюсь проверить записи по значениям первых двух столбцов, чтобы увидеть, какие записи из dataframe1 отсутствуют в dataframe2. Как показано, в dataframe1 есть запись № 8, которая отсутствует в dataframe2. Я видел решение dplyr::anti.join для таких задач с одним условием/столбцом, но оно, похоже, не работает, когда мне нужно оценивать записи по значениям в двух столбцах.

P.S. Я не включил ни одного воспроизводимого примера, так как не видел в этом смысла. Я далек от эксперта в области R или общего кодирования, поэтому вопрос может так или иначе отсутствовать, извините.

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

1. Репрекс — это всегда хорошая идея. Вы могли бы значительно упростить задачу для людей, отвечающих, запустив dput(dataframe1) и dput(dataframe2) — это даст вам исходный код, необходимый для создания объектов. В противном случае людям, отвечающим на этот вопрос, придется создавать их с нуля.

Ответ №1:

Это можно сделать, anti_join() если указать столбцы, которые вы хотите использовать для объединения.

 library(dplyr) library(tibble) dataframe1 = tribble(  ~Company_name, ~Transaction_Code, ~Sum,  "First", 2000, 234,  "First", 3000, 562,  "First", 4000, 105,  "Second", 8888, 740,  "Third", 9000, 325,  "Third", 4000, 145,  "BBB", 1000, 28,  "BBB", 3535, 100 )  dataframe2 = tribble(  ~Company_name, ~Transaction_Code, ~Sum,  "First", 2000, 340,  "First", 3000, 620,  "First", 4000, 050,  "Second", 8888, 400,  "Third", 9000, 250,  "Third", 4000, 450,  "BBB", 1000, 27 )  anti_join(dataframe1, dataframe2, by = c("Company_name", "Transaction_Code"))  

Ответ №2:

setdiff() возможно, это то, что вы ищете :

 df1 lt;- data.frame(company = c("first","first","first","second","third","third","BBB","BBB"),  transac = c(2000,3000,4000,8888,9000,4000,1000,3535),  sum=c(234,562,105,740,325,145,28,100))  df2 lt;- data.frame(company = c("first","first","first","second","third","third","BBB"),  transac = c(2000,3000,4000,8888,9000,4000,1000),  sum=c(340,620,050,400,250,450,27))   setdiff(df1[,1:2],df2[,1:2])  

ВОЗВРАТ

 company transac 1 BBB 3535  

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

1. По какой-то причине он не включает третий столбец, как в решении c_j_fairfield, но все равно указывает на уникальные записи, спасибо