R 从一个数据框中选择行,其中所有列值都存在于第二个数据框中
我想从R 从一个数据框中选择行,其中所有列值都存在于第二个数据框中,r,R,我想从ds1中选择所有列值都存在于第二个数据帧ds2中的行。我发现要做到这一点还有很长的路要走,但可以肯定的是,有一个内置函数可以简化这个过程 ds1 = data.frame(x=c(0,3,2,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,16)) ds2 = data.frame(x=c(1,2,3,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,15)) 由于值ds1$x[1]和ds1$z[5]分别不存在于列:ds2$x和d
ds1
中选择所有列值都存在于第二个数据帧ds2
中的行。我发现要做到这一点还有很长的路要走,但可以肯定的是,有一个内置函数可以简化这个过程
ds1 = data.frame(x=c(0,3,2,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,16))
ds2 = data.frame(x=c(1,2,3,4,5), y=c(6,7,8,9,10), z=c(11,12,13,14,15))
由于值ds1$x[1]
和ds1$z[5]
分别不存在于列:ds2$x
和ds2$z
中,因此不应考虑这些行,因此最终结果应为:
x y z
2 3 7 12
3 2 8 13
4 4 9 14
因此,行:ds1[2:4,]
,我发现这条路很长:
result <- matrix(NA, nrow(ds1), ncol(ds1))
count = 1
for (i in names(ds2)) {
result[,count] <- ds1[, i] %in% ds2[, i]
count <- count + 1
}
rows = rep(NA, nrow(ds1))
for (i in 1:length(rows)) {
rows[i] = all(result[i,])
}
# Finally:
ds1[rows,]
,但由于列元素可以位于不同的行中,如:
ds1$x[2]==ds2$x[3]
,以及ds1x[3]==ds2$x[2]
,它不起作用,我不知道如何设置额外的合并参数以获得预期的结果。您可以使用%中的%和&
语法非常简单、简洁地表达:
ds1[ds1$x %in% ds2$x & ds1$z %in% ds2$z,]
这告诉R“选择ds1
的行,其中以下两个条件为真:
ds1$x
的值位于ds2$x
同样适用于ds1$z
”
%in%
如下图所示更可取,但您可以通过几个连接来实现-merge(merge(ds1,ds2[“x”]),ds2[“z”])
谢谢@Hack-R,这只是一个玩具示例,在我的实际问题中,我有大约52列,所以我仍然需要一个for循环。@DavidLeal当然,但这样做会比使用for循环更快吗?如果你发布一个更能代表我可以展示给你的数据的例子。这可以扩展到任意数量的列,并且for循环比矢量化解决方案的速度要慢很多,因此列越多,使用for循环的次数就越少。我明白你的意思,你的建议是使用如下解决方案:ds1[ds1$x1%在%ds2$x1中&ds1$x2%在%ds2$x2中&ds1$x3%在%ds2$x3中…&ds1$xn%在%ds2$xn中,]
(最多n个变量)将比使用for循环解决方案具有更好的可扩展性。对于我的情况来说,这将是一个大型语句,但耗时更少。
ds1[ds1$x %in% ds2$x & ds1$z %in% ds2$z,]
x y z
2 3 7 12
3 2 8 13
4 4 9 14