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