Как проверить конкретный фрейм данных, используя все строки, и найти различия?

#r

Вопрос:

Использование фрейма данных, подобного этому:

 df1 <- data.frame(id = c(1,2,3,4), num = c(23,42,12,33))
 

и второй такой же, как этот:

 df2 <- data.frame(id = c(1,3,4,2,5), num = c(23,12,33,0,2))
 

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

Примеры результатов:

 df1notexist <- data.frame(id = c(2), num = c(42))

df2notexist <- data.frame(id = c(2,5), num = c(0,2))
 

Ответ №1:

С setdiff помощью от dplyr

 library(dplyr)
setdiff(df1, df2)
setdiff(df2, df1)
 

Ответ №2:

С помощью dplyr

 library(dplyr)

df1 %>%
    anti_join(df2)

df2 %>%
   anti_join(df1)
 

Возврат

 > df1 %>%
    anti_join(df2)
Joining, by = c("id", "num")
  id num
1  2  42
 

и

 > df2 %>%
    anti_join(df1)
Joining, by = c("id", "num")
  id num
1  2   0
2  5   2
 

Ответ №3:

Вот базовый вариант R с использованием subset merge

 > subset(merge(df1, cbind(df2, f = TRUE), all.x = TRUE), is.na(f), select = -f)
  id num
2  2  42

> subset(merge(df2, cbind(df1, f = TRUE), all.x = TRUE), is.na(f), select = -f)
  id num
2  2   0
5  5   2
 

Или мы можем использовать %in% paste

 > df1[!do.call(paste, df1) %in% do.call(paste, df2), ]
  id num
2  2  42

> df2[!do.call(paste, df2) %in% do.call(paste, df1), ]
  id num
4  2   0
5  5   2