基于特定列在两个数据帧中检测不匹配

问题描述 投票:1回答:1

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

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

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

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的不同向量,其x或y上的df1和df2之间存在差异。

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

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

r dplyr matching
1个回答
0
投票

这将同时使用tidyrdplyr

您可以同时为两个数据帧使用pivot_longer,因此您将在xy的单独一行中进行比较。然后使用anti_join查找2个数据帧之间的差异。这将检查任一数据帧中的多余/缺失/不同行。

最后,要获得最终结果,您可以按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 
© www.soinside.com 2019 - 2024. All rights reserved.