如何在以下子列表中逐步执行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)
答案 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)));