Это будет использовать tidyr
и dplyr
.
Сначала вы можете pivot_longer
для обоих фреймов данных, поэтому у вас будет отдельная строка для сравнения x
и y
. Затем используйте anti_join
, чтобы найти различия между двумя фреймами данных. Это позволит проверить наличие лишних / отсутствующих / разных строк в любом фрейме данных.
Наконец, чтобы получить окончательный результат, вы можете отфильтровать по x
или y
, выбрав Ref.Sample.ID
в качестве интересующего вас столбца. и distinct()
для удаления дубликатов. Альтернативой является использование group_by(var)
вместо filter
, если вы хотите, чтобы все результаты были вместе во фрейме данных.
library(tidyverse)
df1_long <- pivot_longer(df1, cols = c(x, y), names_to = "var", values_to = "val", values_ptypes = list(val = 'character'))
df2_long <- pivot_longer(df2, cols = c(x, y), names_to = "var", values_to = "val", values_ptypes = list(val = 'character'))
df_diff <- bind_rows(anti_join(df1_long, df2_long), anti_join(df2_long, df1_long))
df_diff %>%
filter(var == "x") %>%
select(Ref.Sample.ID) %>%
distinct()
Выход
# A tibble: 6 x 1
Ref.Sample.ID
<chr>
1 C-3
2 E-1
3 G-1
4 G-2
5 G-3
6 D-2
Данные
df1 <- structure(list(Ref.ID = c("A", "B", "C", "C", "C", "D", "D",
"E", "F", "G", "G", "G"), Sample.ID = c(1L, 1L, 1L, 2L, 3L, 1L,
1L, 1L, 1L, 1L, 2L, 3L), Ref.Sample.ID = c("A-1", "B-1", "C-1",
"C-2", "C-3", "D-1", "D-1", "E-1", "F-1", "G-1", "G-2", "G-3"
), x = c(2000L, 1992L, 2018L, 2018L, 2018L, 2011L, 2011L, 1990L,
1990L, 2015L, 2015L, 2015L), y = c("a", "a", "b", "b", "b", "c",
"c", "a", "c", "d", "d", "d")), class = "data.frame", row.names = c(NA,
-12L))
df2 <- structure(list(Ref.ID = c("A", "B", "C", "C", "D", "D", "E",
"F", "G", "G", "G"), Sample.ID = c(1L, 1L, 1L, 2L, 1L, 2L, 1L,
1L, 1L, 2L, 3L), Ref.Sample.ID = c("A-1", "B-1", "C-1", "C-2",
"D-1", "D-2", "E-1", "F-1", "G-1", "G-2", "G-3"), x = c(2000L,
1992L, 2018L, 2018L, 2011L, 2011L, 1991L, 1990L, 2011L, 2011L,
2011L), y = c("a", "a", "b", "b", "a", "a", "a", "d", "d", "d",
"c")), class = "data.frame", row.names = c(NA, -11L))