【问题标题】:sub-list element combinations within sublists of unequal lengths长度不等的子列表中的子列表元素组合
【发布时间】:2016-06-04 02:06:54
【问题描述】:

我怎样才能在以下子列表上逐步展开 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)

【问题讨论】:

  • 不就是lapply(list_of_lists, expand.grid)吗?如果您愿意,您可以过滤掉integer(0)s(expand.grid 无法处理它们)。另外,仅供参考mapply( ... , SIMPLIFY = FALSE) 只是Map

标签: r


【解决方案1】:

您可以在此处使用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)));

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多