2017-05-14 32 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

相關問題