2016-02-04 46 views
2

我有一個列表數據如下:如何expand.grid特定對象列表中,形成一個新的列表

a<-list(10,c(8,9),5,14,c(3,7),c(2,3),5,13,c(3,4),4,5,8,12,c(2,3),c(5,7)) 

一個

[1]
[ 1] 10

[[2]]
[1] 8 9

[[3]]
[1] 5

[[4]]
[1] 14

[[5]]
[1] 3 7

[[6]]
[1] 2 3

[[7]]
[1] 5

[[8]]
[1] 13

[[9]]
[1] 3 4

[[10]]
[1] 4

[[11]]
[1] 5

[[12]]
[1] 8

[[13]]
[1] 12

[[14]]
[1] 2 3

[[ 15]]
[1] 5 7

然後,我想在列表a中的每3個對象中使用「expand.grid」。
也就是說,分別擴展1,2,3,4,6,7-9,10-12,13-15,然後將這些結果組合到一個新的列表中。

結果應該像下面的樣子。

enter image description here

我只是用foolishest的方式來解決這個問題:list(expand.grid(a[1:3]),expand.grid(a[4:6]),expand.grid(a[7:9]),expand.grid(a[10:12]),expand.grid(a[13:15]))

當我嘗試使用 「sapply」:sapply(1:(length(a)/3), function(x){expand.grid(a[1:3+3*x-3])})它沒有工作,結果如下:

enter image description here

我不知道爲什麼,你能幫我解決這個問題,非常感謝你!

+0

如果你的列表是三的倍數......'lapply(as.data.frame(matrix(a,3)),expand.grid)' – user20650

回答

2

我們可以用gl,split創建一個分組索引,使用該索引並使用expand.grid的'a'子集,list元素。

lapply(split(seq_along(a), as.numeric(gl(length(a), 3, length(a)))), 
         function(i) expand.grid(a[i])) 

我們也可以使用sapply,但要確保我們使用simplify=FALSE的選項

的OP與simplify=FALSE代碼給出

sapply(1:(length(a)/3), function(x) 
     {expand.grid(a[1:3+3*x-3])}, simplify=FALSE) 

根據?sapply

簡化:邏輯或字符串;如果可能,結果應該簡化爲 向量,矩陣或更高維數組?對於 sapply,它必須命名而不是縮寫。如果合適,默認值TRUE 返回向量或矩陣,而如果簡化= 「數組」,則結果可能是「rank」(=長度(dim(。)))的數組,其中 高於FUN(X [[I]])。

+0

很好!非常感謝! O(∩_∩)O – lightsnail

+1

你太棒了!謝謝! – lightsnail

相關問題