为了确定数据框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
。
现在我想知道是否有一种更优雅 - 也许更有效 - 的方式来回答这个问题?
此任务也可以轻松扩展,以查找两个给定数据帧之间的交集,可能仅基于列的子集。
非常感谢帮助。
答案 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)
上进行规范排序。