首页 > 解决方案 > 将列表列表的维度组合成单独的向量

问题描述

这是我的数据示例。

ll <- list(
  ll1 = list(Mi = 1:4,
       Mj = 10:13,
       dn = "l1"),
  ll2 = list(Mi = 5:8,
             Mj = 14:17,
             dn = "l2"))
> str(ll)
List of 2
 $ ll1:List of 3
  ..$ Mi: int [1:4] 1 2 3 4
  ..$ Mj: int [1:4] 10 11 12 13
  ..$ dn: chr "l1"
 $ ll2:List of 3
  ..$ Mi: int [1:4] 5 6 7 8
  ..$ Mj: int [1:4] 14 15 16 17
  ..$ dn: chr "l2"

我正在尝试将每个 Mi、每个 Mj 和每个 dn 组合在一起。所以最终结果将是 3 个向量:1 个组合的 Mi、1 个组合的 Mj 和 1 个组合的 dn。即, Mi 的最终结果将类似于

> c(ll$ll1$Mi,ll$ll2$Mi)
[1] 1 2 3 4 5 6 7 8

Mj 和 dn 的最终结果相似。我想知道如何简单地做到这一点,最好使用来自 tidyverse 的东西。列表的数量会有所不同,通常不会是 2,这就是为什么我不认为 c 是一个很好的解决方案。我猜地图功能可以在这里工作,但我还没有找到解决方案。

标签: rlistmergetidyverse

解决方案


pmappurrr. _ pmap获取输入列表(在本例中为两个列表的列表)并将c函数应用于ll[[1]][[1]], ll[[2]][[1]], ... 然后ll[[1]][[2]], ll[[2]][[2]], ... 等等:

library(purrr)
pmap(ll, c)

输出:

$Mi
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
   1    2    3    4    5    6    7    8 

$Mj
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
  10   11   12   13   14   15   16   17 

$dn
 ll1  ll2 
"l1" "l2"

如果我们不想保留向量名称,我们可以使用以下use.names参数c

pmap(ll, c, use.names = FALSE)

输出:

$Mi
[1] 1 2 3 4 5 6 7 8

$Mj
[1] 10 11 12 13 14 15 16 17

$dn
[1] "l1" "l2"

推荐阅读