我想从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,]
我怀疑它应该以一种更简单的方式使用一些内置的功能组合,我谷歌它,但我没有发现任何类似的情况。
注意:我正在玩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]
,它不起作用,我不知道如何设置其他合并参数以获取预期的结果。
答案 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
行:
ds1$x
的值位于ds2$x
ds1$z
“