如何在列表中展开特定对象以形成新列表

时间:2016-02-04 17:04:45

标签: r list

我有一个列表数据如下:

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

然后我想使用&#34; expand.grid&#34;在列表a中的每3个对象中 也就是说,分别对expand.grid 1-3,4-6,7-9,10-12,13-15进行扩展,然后将这些结果组合成一个新的列表形式。

结果应该跟随外表。

enter image description here

我只是用最愚蠢的方法来解决这个问题: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]))

当我尝试使用&#34; sapply&#34;:sapply(1:(length(a)/3), function(x){expand.grid(a[1:3+3*x-3])})它没有用时,结果如下:

enter image description here

我不知道为什么,你能帮我解决这个问题吗,非常感谢你!

1 个答案:

答案 0 :(得分:2)

我们可以创建一个分组索引glsplit序列'a',使用索引将list元素子集化并使用expand.grid

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,   如果合适,返回向量或矩阵,而如果则为simplify =   “array”结果可能是“rank”(= length(dim(。)))one的数组   高于FUN(X [[i]])的结果。