我正在使用R来标识数据帧的两列中的配对值,该值与另一个数据帧的两列中的配对值相同。我以为自己找到了解决方案,但结果与我的预期不符,我想知道是否有人可以解释原因。
df1看起来像这样:
Col1 Col2 Col3
A 1000 5
A 1500 10
A 2000 15
A 2500 20
B 900 5
B 1200 10
B 1500 15
C 1000 5
C 1200 10
C 1700 15
C 2200 20
C 2250 22
df2包含与df1相同的内容,外加一些其他不匹配的行:
Col1 Col2 Col3
A 1000 5
A 1500 10
A 2000 15
A 2500 20
A 3000 20
A 3200 22
A 3400 25
B 900 5
B 1200 10
B 1500 15
B 1700 20
B 1900 26
C 1000 5
C 1200 10
C 1700 15
C 2200 20
C 2250 22
C 2400 25
C 3000 30
C 3500 31
我想在df1的Col1和Col2中找到配对的值,这些值也在df2的Col1和Col2中找到。我无法比较数据帧之间的整个行,因为Col3中的值在数据帧之间可能有所不同。我使用以下代码在df1的Col1和Col2中查找值,这些值也在df2的Col1和Col2中找到:
x = subset(df1, Col1 %in% df2$Col1 & Col2 %in% df2$Col2)
哪个返回预期结果:
Col1 Col2 Col3
A 1000 5
A 1500 10
A 2000 15
A 2500 20
B 900 5
B 1200 10
B 1500 15
C 1000 5
C 1200 10
C 1700 15
C 2200 20
C 2250 22
但是,当我切换哪个数据帧与另一个数据帧时:
y = subset(df2, Col1 %in% df1$Col1 & Col2 %in% df1$Col2)
我得到了相同的结果,只是现在又增加了一行B 1700 20:
Col1 Col2 Col3
A 1000 5
A 1500 10
A 2000 15
A 2500 20
B 900 5
B 1200 10
B 1500 15
B 1700 20
C 1000 5
C 1200 10
C 1700 15
C 2200 20
C 2250 22
请注意,在df1中找不到B 1700 20,为什么在此结果中返回它?我认为我的代码没有按照我的想法做,也许Col1和Col2的配对性质实际上并未保留在数据帧之间?我将不胜感激任何改进我的代码的解释和建议!
答案 0 :(得分:1)
这是inner_join
library(dplyr)
out1 <- inner_join(df1, df2[1:2], by = c("Col1", "Col2"))
out2 <- inner_join(df1, df1[1:2], by = c("Col1", "Col2"))
identical(nrow(out1), nrow(out2))
还要注意,intersect
中的dplyr
可以获取data.frame并返回一个data.frame
out1 <- intersect(df1, df2)
out2 <- intersect(df2, df1)
在示例中,两个数据集具有相同的值。如果要比较列的子集,请对数据集进行子集并执行intersect
。区别在于,与inner_join