3

为了找出数据框是否是数据框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.

现在我想知道是否有更优雅——可能更有效——的方式来回答这个问题?

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

帮助将不胜感激。

4

1 回答 1

0

我将冒险猜测一个答案。

我认为semi_joinfromdplyr会做你想做的事,即使考虑到重复的行。

首先注意帮助文件?semi_join

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

半连接与内连接不同,因为内连接将为 y 的每个匹配行返回一行 x,其中半连接永远不会复制 x 的行。

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

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)是获得规范排序所必需的df.a

于 2015-03-30T23:48:37.363 回答