【发布时间】:2015-03-30 21:18:51
【问题描述】:
为了找出数据框 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中。
现在我想知道是否有更优雅——可能更有效——的方式来回答这个问题?
此任务还可以轻松扩展,以查找两个给定数据帧之间的交集,可能仅基于列的子集。
我们将不胜感激。
【问题讨论】:
-
可能是
all(mapply("%in%", df.a, df.b))?当然,假设它们具有相同顺序的相同列。或者对于列子集和正确列顺序的更安全的方法可能是cols <- c("x", "y") ; all(mapply("%in%", df.a[cols], df.b[cols])) -
识别配对是否重要?
data.frame(a=1:4, b=5:8)是data.frame(a=8:1, b=1:8)的子集。我会说不,但意见可能会有所不同。 -
@DavidArenburg,我认为这可能会因
c(2, 2)包含在c(2)中的情况而变得复杂? -
假设数据框行中没有重复项,您可以使用 dplyr 包中的
merge或inner_join。 -
我认为
dplyr::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 ); df.c <- data.frame( x=c(1:7, 1), y= c(6:12, 6) )、semi_join(df.b, df.a)失败但semi_join(df.c, df.a)成功(直到规范排序)
标签: r dataframe subset set-intersection