从一个数据框中选择行,其中第二个数据框中存在所有列值

时间:2016-12-12 03:05:57

标签: 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$xds2$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,]

我怀疑它应该以一种更简单的方式使用一些内置的功能组合,我谷歌它,但我没有发现任何类似的情况。

注意:我正在玩merge,例如:merge(ds1,ds2)

> merge(ds1, ds2)
  x y  z
1 4 9 14

,但因为列元素可以位于不同的行中,如:ds1$x[2] == ds2$x[3]ds1x[3] == ds2$x[2],它不起作用,我不知道如何设置其他合并参数以获取预期的结果。

1 个答案:

答案 0 :(得分:2)

您可以使用%in%&语法来简单明了地表达这一点:

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

这告诉R“选择以下两个条件为真的ds1行:

  1. ds1$x的值位于ds2$x
  2. 的某处
  3. 同样适用于ds1$z