2013-01-19 31 views
3

謝謝您對我以前的問題的回覆。我有兩個列表:list1和list2。我想知道list1的每個對象是否包含在list2的每個對象中。例如:確定列表中包含哪些列表中的對象(子集)在R的另一個列表中

> list1 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

> list2 
[[1]] 
[1] 1 2 3 

[[2]] 
[1] 2 3 

[[3]] 
[1] 2 3 

這裏是我的問題:1。 )您如何請問R鍵檢查對象是在列表中的其他對象的一個​​子集? 例如,我想檢查list2[[3]]={2,3}是否包含在(子集)list1[[2]]={2}中。當我做list2[[3]] %in% list1[[2]]時,我得到[1] TRUE FALSE。但是,這不是我想做的事情?!我只想檢查list2[[3]]是否爲list1[[2]]的子集,即{3}的{2,3} \子集與集合理論概念中一樣?我不想執行元素檢查,因爲R似乎正在用%命令中的%進行。有什麼建議麼?

2)是否有某種方式來有效地使所有成對子集比較(即list1[[i]]list2[[j]]子集,所有i,j組合?請問像outer(list1,list2, func.subset)工作一度的第1題的回答? 感謝您的反饋!

回答

5

setdiff比較獨特

length(setdiff(5, 1:5)) == 0 

另外,all(x %in% y)將很好地工作。

要做到所有的比較,像這樣的工作:

dt <- expand.grid(list1,list2) 
dt$subset <- apply(dt,1, function(.v) all(.v[[1]] %in% .v[[2]])) 


    Var1 Var2 subset 
1 1 1, 2, 3 TRUE 
2 2 1, 2, 3 TRUE 
3 3 1, 2, 3 TRUE 
4 1 2, 3 FALSE 
5 2 2, 3 TRUE 
6 3 2, 3 TRUE 
7 1 2, 3 FALSE 
8 2 2, 3 TRUE 
9 3 2, 3 TRUE 

注意,expand.grid用大量的數據處理(迪文的解決方案是在這方面更好時,是不是這樣做的最快方法),但它可以讓你快速檢查是否這是做你想做的。

+0

+1這是更好的'is.subset'。我也喜歡你使用點來標記內聯函數形式。 –

1
is.subset <- function(x,y) {length(setdiff(x,y)) == 0} 

首先是的列表2項子集list1的元件的組合:

> sapply(1:length(list1), function(i1) sapply(1:length(list2), 
       function(i2) is.subset(list1[[i1]], list2[[i2]]))) 
     [,1] [,2] [,3] 
[1,] TRUE TRUE TRUE 
[2,] FALSE TRUE TRUE 
[3,] FALSE TRUE TRUE 

然後不足爲奇缺乏任何list2中的項目(所有長度> 1),這些列表中的一個的子集項目(所有長度爲1):

> sapply(1:length(list1), function(i1) sapply(1:length(list2), 
       function(i2) is.subset(list2[[i2]], list1[[i1]]))) 
     [,1] [,2] [,3] 
[1,] FALSE FALSE FALSE 
[2,] FALSE FALSE FALSE 
[3,] FALSE FALSE FALSE 
2

可以按如下方式使用sets包:

library(sets) 
is.subset <- function(x, y) as.set(x) <= as.set(y) 

outer(list1, list2, Vectorize(is.subset)) 
#  [,1] [,2] [,3] 
# [1,] TRUE FALSE FALSE 
# [2,] TRUE TRUE TRUE 
# [3,] TRUE TRUE TRUE 

@Michael或@Dinin的基本版本is.subset也能正常工作,但對於你的問題的第二部分,我認爲outer是要走的路。

+0

+1是'outer'有用性的一個很好的例子。 –

0

增加@邁克爾的,這裏有一個巧妙的方法避免expand.grid的混亂使用ASIS功能:

list2 <- list(1:3,2:3,2:3) 
a <- data.frame(list1 = 1:3, I(list2)) 
a$subset <- apply(a, 1, function(.v) all(.v[[1]] %in% .v[[2]])) 

    list1 list2 subset 
1  1 1, 2, 3 TRUE 
2  2 2, 3 TRUE 
3  3 2, 3 TRUE 
相關問題