首页 > 解决方案 > 重塑由 lapply 创建的列表

问题描述

我有纬度和经度的向量:

longDim
[1] -79.65770 -79.21761 -78.77750
latiDim
[1] -39.70588 -39.26471 -38.82353

我想并行循环它们的组合。为此,首先我用expand.grid所有可能的组合创建了一个数据框:

my.grid <- expand.grid(longDim, latiDim) 

然后我mclapply()在结果数据框的行上使用:

mclapply(1:nrow(my.grid), function(x){some_function})

wheresome_function返回一个包含两个对象的列表,每个对象的长度为 139。

因此,结果我得到了一个尺寸为 9x2 的嵌套列表,如下所示:

str(l1)
List of 9
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 2
  ..$ su.25: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ su.30: Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...

现在,我需要再次将这个列表从 9x2 重塑为 3x3x2 维度。这是我正在寻找的格式:

str(l2)
List of 3
 $ :List of 3
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 3
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
 $ :List of 3
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  ..$ :List of 2
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...
  .. ..$ : Named num [1:139] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "names")= chr [1:139] "1961" "1962" "1963" "1964" ...

我怎样才能做到这一点?

重现代码l1l2可在以下位置找到:https ://pastebin.com/raw/LTyZi0mp (此处发布太长)

标签: rlistlapplyreshapemclapply

解决方案


We can also use gl to create a grouping index for spliting

split(lst, as.integer(gl(length(lst1), 3, length(lst1))))

data

lst1 <- replicate(9, list(list(x = 1:5, y = 1:5)))

推荐阅读