我必须对具有两个独立评估者评分的数据帧。在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”
这将同时使用tidyr
和dplyr
。
您可以同时为两个数据帧使用pivot_longer
,因此您将在x
和y
的单独一行中进行比较。然后使用anti_join
查找2个数据帧之间的差异。这将检查任一数据帧中的多余/缺失/不同行。
最后,要获得最终结果,您可以按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