R:如何有效地找出data.frame A是否包含在data.frame B中?

时间:2015-03-30 21:18:51

标签: r dataframe subset set-intersection

为了确定数据框df.a是否是数据框df.b的子集,我执行了以下操作:

df.a <- data.frame( x=1:5, y=6:10 )
df.b <- data.frame( x=1:7, y=6:12 )
inds.x <- as.integer( lapply( df.a$x, function(x) which(df.b$x == x) ))
inds.y <- as.integer( lapply( df.a$y, function(y) which(df.b$y == y) ))
identical( inds.x, inds.y )

最后一行提供了TRUE,因此df.a中包含df.b

现在我想知道是否有一种更优雅 - 也许更有效 - 的方式来回答这个问题?

此任务也可以轻松扩展,以查找两个给定数据帧之间的交集,可能仅基于列的子集。

非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

我会猜测答案。

我认为来自semi_join的{​​{1}}会做你想要的,即使考虑到重复的行。

首先请注意帮助文件dplyr

  

返回x中匹配值的所有行,只保留x中的列。

     

半连接与内连接不同,因为内部连接   join将为y的每个匹配行返回一行x,   半连接将在哪里   永远不要复制x行。

好的,这表明以下内容应该正确失败:

?semi_join

给出了df.a <- data.frame( x=c(1:5,1), y=c(6:10,6) ) df.b <- data.frame( x=1:7, y=6:12 ) identical(semi_join(df.b, df.a), semi_join(df.a, df.a)) ,正如预期的那样

FALSE

但是,以下内容应该通过:

> semi_join(df.b, df.a)
Joining by: c("x", "y")
  x  y
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10

确实如此,给予df.c <- data.frame( x=c(1:7, 1), y= c(6:12, 6) ) identical(semi_join(df.c, df.a), semi_join(df.a, df.a))

需要第二个TRUE才能在semi_join(df.a, df.a)上进行规范排序。