省略列表中所有不共享公共ID的data.frames中的行

时间:2017-05-14 15:59:28

标签: r

我有一个列表,其中包含不同大小的几个数据框(本例中只有2个)。

> myList
$`1`
   ID values
1   1    100
2   2    200
3   3    240
4   4    403
5   5    212
6   6    432
7   7    423
8   8    123
9   9    543
10 10    982

$`2`
  ID values
1  3    432
2  5    333
3  6    981

现在,我需要在任何其他数据帧中不共享ID的数据帧中省略所有行。在此示例中,我要查找的结果是:

> myList2
$`1`
   ID values
3   3    240
5   5    212
6   6    432

$`2`
  ID values
1  3    432
2  5    333
3  6    981

我已尝试使用dplyr::setequal()但最终使用FALSE: Different number of rows。如果可能的话,我更喜欢基础解决方案。提前谢谢!

可重复的代码:

myList <- list(data.frame('ID' = c(1:10), 'values' = c(100,200,240,403,212,432,423,123,543,982)),data.frame('ID' = c(3,5,6), 'values' = c(432,333,981)))

1 个答案:

答案 0 :(得分:3)

通过基础R的一种方法是使用Reduce(intersect, ...)从列表中的所有数据帧中查找公共ID。然后我们使用它来索引数据框。

ind <- Reduce(intersect, lapply(myList, '[[', 1))

lapply(myList, function(i) i[i$ID %in% ind,])
#[[1]]
#  ID values
#3  3    240
#5  5    212
#6  6    432

#[[2]]
#  ID values
#1  3    432
#2  5    333
#3  6    981