我有两个数据集,我想通过两个识别变量(up和ver_u)合并:
df1 looks like this:
up ver_u
257001 1
1010 1
101010 1
100316 1
df2 looks like this:
up ver_u code_uc quantity
500116 1 395884 1
100116 1 36761 2
160116 1 81308 3
100116 1 76146 1
113216 1 6338 1
101116 1 33887 1
我想要做的是取出df2的一个子集,其中up和ver_u与df1中的匹配。我以两种不同的方式做到这一点,我得到了不同的答案。
第一种方法:
pur <- merge(df2, df1,by=c("up","ver_u"))
第二种方法:
test <- df2[(df2$up %in% df1$up) & (df2$ver_u %in% df1$ver_u),]
他们给了我不同数量的观察结果,我不明白他们为什么给我一个区别。
当我使用以下代码在数据帧测试中使用合并时,我获得了相同数量的观察结果,但我得到的两个结果数据帧仍然不同。
pur1 = merge(test, df1,by=c("up","ver_u"))
在%中使用merge和%有一些系统差异吗?
非常感谢对此的任何见解。
答案 0 :(得分:4)
因为merge
正在逐行比较两列,而%in%
正在将一行与所有其他行进行比较。例如:
#dummy data
df1 <- data.frame(x = c(1,2,3),
y = c(2,3,4))
df1
# x y
# 2 2 3
# 3 3 4
df2 <- data.frame(x = c(2,3,1,3),
y = c(3,1,4,1))
df2
# x y
# 1 2 3
# 2 3 1
# 3 1 4
# 4 3 1
# using merge
merge(df1, df2, by = c("x", "y"))
# x y
# 1 2 3
# using %in%
df1[(df1$x %in% df2$x) & (df1$y %in% df2$y), ]
# x y
# 2 2 3
# 3 3 4