Обнаружить несоответствия в двух фреймах данных на основе указанного столбца c - PullRequest
1 голос
/ 21 апреля 2020

У меня есть данные фреймов с оценками двух независимых рейтингов. В столбце х был указан год публикации документов с определенным ссылочным идентификатором (Ref.ID). Для некоторой бумаги несколько образцов были закодированы. Эта информация отражается в переменной «Sample.ID» (например, в df1 есть три образца, кодированные для Ref.ID «C»). Комбинация ссылочного идентификатора и идентификатора образца представлена ​​в переменной «Ref.Sample.ID». Я хотел бы знать, для которого Ref.Sample.ID кодирование переменной x отличается между df1 и df2. Обратите внимание, что df2 имеет на одну строку меньше df1, потому что оценщик в df2 кодировал только две выборки для Ref.ID "C", тогда как оценщик в df1 кодировал три выборки.

Я пытаюсь найти код R, который выявит несоответствия между df1 и df2. Несоответствия могут возникать либо потому, что было закодировано разное количество строк в Ref.ID, либо потому, что x отличается между df1 и df2 для одного и того же Ref.Sample.ID.

Кто-нибудь знает, как это лучше всего сделать? Я счастлив за каждый намек Например, для x: "C -3", "E-1", "G-1", "G-2", "G-3", "D-2"

Для y: "C - 3 "" D-1 "" F-1 "" G-3 "" D-2 "

1 Ответ

0 голосов
/ 21 апреля 2020

Это будет использовать 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))
...