2017-05-14 26 views
2

我有一个列表,其中包含多个不同大小的数据框(本示例中只有2个)。省略列表中所有data.frames中的行,不共享公共ID的行

> 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))) 

回答

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 
+0

谢谢你,那上面的工作完美的例子,但不知何故,它不符合我的实际数据: –

+0

' 的2 1 $列表: 'data.frame':\t 735 OBS。 53个变量: .. $ obsId:chr [1:735]“15597”“15598”“15599”“15600”... .. $ subjectId:num [1:735] 2230 2231 2233 2232 2235 .. .. $ procedureSampleId:num [1:735] 6 6 6 6 6 6 6 6 6 ... $ 2:'data.frame':\t 8 obs。 53个变量: .. $ obsId:chr [1:8]“15628”“15707”“15828”“15938”... .. $ subjectId:num [1:8] 2260 2338 2458 2567 2687 .. .. $ procedureSampleId:num [1:8] 6 6 6 6 6 6 6 6 ' –

+0

什么是错误? – Sotos

相关问题