2012-10-22 36 views
4

說兩個列表的組合,我有兩個列表:的elementwise中的R

list.a <- as.list(c("a", "b", "c")) 

list.b <- as.list(c("d", "e", "f")) 

我想這些列表遞歸結合,使得其結果將是組合的元素的列表作爲如下所示的矢量:

[[1]] 
[1] a d 

[[2]] 
[1] a e 

[[3]] 
[1] a f 

[[4]] 
[1] b d 

等等。我覺得我在這裏錯過了一些相對簡單的事情。任何幫助?

乾杯。

+4

'ex pand.grid(list.a,list.b)''會在'data.frame'結構中給你想要的東西,這可以說是更有用。 –

+0

我需要do.call的結果列表來生成一系列圖,其中x是list.a的元素,y是list.b的元素(即a [1],b [1 ]; a [1],b [2]; ...; a [n],b [k])。 – sinclairjesse

+0

請參閱我的回答下面 –

回答

11

expand.grid(list.1, list.b)data.frame結構中給出了期望的結果。這往往是最有用的格式爲R.使用數據。然而,你可以用一個電話讓你問(保存排序)的確切結構applylapply

result.df <- expand.grid(list.a, list.b) 
result.list <- lapply(apply(result.df, 1, identity), unlist) 

如果你想要這個列表中的第一個元素下令:

result.list <- result.list[order(sapply(result.list, head, 1))] 
+0

這是不可重現的。什麼是k? – sinclairjesse

+0

固定!對此表示歉意 –

+0

+1 - 很高興看到'expand.grid()'適用於列表以及「簡單」向量。 –

3

這讓你你在找什麼:

unlist(lapply(list.a, function(X) { 
    lapply(list.b, function(Y) { 
     c(X, Y) 
    }) 
}), recursive=FALSE) 
1

這是一個有點蠻力的方法,將,如果它們具有相同的尺寸,則將list.b附加到list.a,遞歸地使用append函數。

# CREATE LIST OBJECTS 
    list.a <- as.list(c("a", "b", "c")) 
    list.b <- as.list(c("d", "e", "f")) 

# CREATE AN EMPTY LIST TO POPULATE  
list.ab <- list() 

# DOUBLE LOOP TO CREATE RECURSIVE COMBINATIONS USING append 
    ct=0  
     for(i in 1:length(list.a)) {  
     for (j in 1:length(list.b)) { 
      ct=ct+1 
      list.ab[[ct]] <- append(list.a[[i]], list.b[[j]])  
     } 
     } 

# PRINT RESULTS 
list.ab 
2

這是一個功能,您可以通過列表來擴大

expand.list <- function(...){ 
    lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)} 

expand.list(list.a, list.b) 
5

你想mapply(如果 「遞歸」 你的意思是 「並聯」):

mapply(c, list.a, list.b, SIMPLIFY=FALSE) 

或者也許這是你想要的更多:

unlist(lapply(list.a, function(a) lapply(list.b, function (b) c(a, b))), recursive=FALSE)