我有一个列表数据如下:
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))
一
[[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进行扩展,然后将这些结果组合成一个新的列表形式。
结果应该跟随外表。
我只是用最愚蠢的方法来解决这个问题: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])})
它没有用时,结果如下:
我不知道为什么,你能帮我解决这个问题吗,非常感谢你!
答案 0 :(得分:2)
我们可以创建一个分组索引gl
,split
序列'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]])的结果。