#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