#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, но все равно указывает на уникальные записи, спасибо