不等长度子列表中的子列表元素组合

时间:2016-06-04 02:06:54

标签: r

如何在以下子列表中逐步执行expand.grid。

list ( list ( c (1,4,6) , c ( 2 , 5 )),list ( c (9,12), c(3,6), c(1,1),c(6,9)),list(c(8,10),c(integer(0)),c(integer(0)),c(integer(0)), c(integer(0)),c(integer(0))))

我知道我可以使用以下表达式来对列表Something like expand.grid on a list of lists进行扩展网格。

do.call ( rbind , do.call ( mapply, list, FUN = data.frame, SIMPLIFY = FALSE)))

但由于我的列表长度不相等,因此该功能不起作用。

所需的输出应该是一组具有不同子列表组合的子列表。如下所示,请注意列表并非所有组合都可能,但元素仅使用一次,并且总是按照子段中元素的顺序递增。

1 2 
4 2 
6 2 
1 5  
4 5 
6 5  

9  3 1 6
9  6 1 6
12 3 1 9
12 6 1 9 

8  integer(0) integer(0) integer(0) integer(0) integer(0)
10 integer(0) integer(0) integer(0) integer(0) integer(0)

1 个答案:

答案 0 :(得分:0)

您可以在此处使用do.call(expand.grid,...),但必须单独将其应用于每个顶级列表组件,这可以通过lapply()完成。此外,对于第三个顶级组件,您必须过滤掉空向量,否则它们会将expand.grid()的结果呈现为空。

l <- list(list(c(1,4,6),c(2,5)),list(c(9,12),c(3,6),c(1,1),c(6,9)),list(c(8,10),c(integer(0)),c(integer(0)),c(integer(0)),c(integer(0)),c(integer(0))));
lapply(l,function(x) do.call(expand.grid,Filter(function(x) length(x)>0L,x)));
## [[1]]
##   Var1 Var2
## 1    1    2
## 2    4    2
## 3    6    2
## 4    1    5
## 5    4    5
## 6    6    5
##
## [[2]]
##    Var1 Var2 Var3 Var4
## 1     9    3    1    6
## 2    12    3    1    6
## 3     9    6    1    6
## 4    12    6    1    6
## 5     9    3    1    6
## 6    12    3    1    6
## 7     9    6    1    6
## 8    12    6    1    6
## 9     9    3    1    9
## 10   12    3    1    9
## 11    9    6    1    9
## 12   12    6    1    9
## 13    9    3    1    9
## 14   12    3    1    9
## 15    9    6    1    9
## 16   12    6    1    9
##
## [[3]]
##   Var1
## 1    8
## 2   10

哇,正如alistaire在他的评论中所指出的那样,expand.grid()除了向它传递多个向量参数的更常见用法之外,还在一个由向量​​列表组成的单个参数上工作。很难跟踪哪些R功能支持这种双重接口,哪些不支持。例如,cumsum()支持它,但sum()没有。无论如何,这里是如何简化解决方案以利用这种便利:

lapply(l,function(x) expand.grid(Filter(function(x) length(x)>0L,x)));