【问题标题】:Detect mismatches in two data frames based on a specific column根据特定列检测两个数据帧中的不匹配
【发布时间】:2020-04-22 04:21:26
【问题描述】:

我必须对两个独立评分者的评分进行数据帧。在 x 列中,对具有特定参考 ID (Ref.ID) 的论文的发表年份进行了编码。对于某些论文,对多个样本进行了编码。该信息反映在变量“Sample.ID”中(例如,在 df1 中,三个样本编码为 Ref.ID“C”)。参考 ID 和样品 ID 的组合在变量“Ref.Sample.ID”中表示。我想知道哪个 Ref.Sample.ID 的变量 x 的编码在 df1 和 df2 之间不同。请注意,df2 比 df1 少一行,因为 df2 中的评估者只为 Ref.ID“C”编码了两个样本,而 df1 中的评估者编码了三个样本。

我正在尝试找到一个可以暴露 df1 和 df2 之间不匹配的 R 代码。出现不匹配的原因可能是每个 Ref.ID 编码的行数不同,或者是因为同一 Ref.Sample.ID 的 df1 和 df2 之间的 x 不同。

有谁知道如何做到最好?我为每一个提示感到高兴:)

df1 <- read.table(text="
  Ref.ID    Sample.ID    Ref.Sample.ID     x       y
  A         1            A-1               2000    a    
  B         1            B-1               1992    a
  C         1            C-1               2018    b 
  C         2            C-2               2018    b   
  C         3            C-3               2018    b   
  D         1            D-1               2011    c 
  D         1            D-1               2011    c
  E         1            E-1               1990    a      
  F         1            F-1               1990    c   
  G         1            G-1               2015    d   
  G         2            G-2               2015    d    
  G         3            G-3               2015    d", header=TRUE)

# Note df2 has one row less than df1!

df2 <- read.table(text="
  Ref.ID    Sample.ID    Ref.Sample.ID     x       y     
  A         1            A-1               2000    a   
  B         1            B-1               1992    a
  C         1            C-1               2018    b
  C         2            C-2               2018    b   
  D         1            D-1               2011    a 
  D         2            D-2               2011    a
  E         1            E-1               1991    a       
  F         1            F-1               1990    d   
  G         1            G-1               2011    d    
  G         2            G-2               2011    d     
  G         3            G-3               2011    c", header=TRUE)

最终结果应该是 Ref.Sample.ID 的不同向量,其中 df1 和 df2 在 x 或 y 上存在差异。

例如 对于 x: “C-3”“E-1”“G-1”“G-2”“G-3”“D-2”

对于 y: “C-3”“D-1”“F-1”“G-3”“D-2”

【问题讨论】:

  • 我想我需要两件事。首先,我需要这样的检查:IF df1$ref.sample.id == df2$ref.sample.id, THEN df1$x == df2$x。如果这是 FALSE,那么我想查看它为 false 的 ref.sample.id。其次,我需要检查 df1 和 df2 中每个 ref.id 是否编码了相同数量的行。如果不是这种情况,我想查看不是这种情况的 ref.id。
  • 是的,我认为可以。
  • 尝试类似:unique(bind_rows(anti_join(df1, df2), anti_join(df2, df1))[["Ref.Sample.ID"]]) ... 需要library(dplyr)
  • 酷,它起作用了 :) 但是,如果我还有另一个变量 y 我也想检查它的评级怎么办。同样,我想查看 Ref.Sample.ID 的向量,但我也想知道“不匹配”是在 x 列还是 y 列上。有没有优雅的方法来做到这一点?
  • 当然,我更新了我原来的帖子!

标签: r dplyr matching


【解决方案1】:

这将同时使用tidyrdplyr

您可以先将pivot_longer 用于两个数据框,这样您将有一个单独的行供xy 进行比较。然后使用anti_join 找出两个数据帧之间的差异。这将检查任一数据框中的额外/缺失/不同行。

最后,要获得最终结果,您可以按xy 进行过滤,选择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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多