为什么使用merge和%in%存在差异?

时间:2016-06-13 21:41:54

标签: r merge subset

我有两个数据集,我想通过两个识别变量(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和%有一些系统差异吗?

非常感谢对此的任何见解。

1 个答案:

答案 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