将列表列表的维合并到单独的向量中

时间:2018-09-24 17:27:49

标签: r list merge tidyverse

这是我的数据示例。

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。也就是说,小米的最终结果将是

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

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

3 个答案:

答案 0 :(得分:7)

使用pmap中的purrrpmap接受输入列表(在本例中为两个列表),并将c函数应用于ll[[1]][[1]]ll[[2]][[1]],...然后{{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)

答案 1 :(得分:2)

另一种选择是使用$Mi [1] 1 2 3 4 5 6 7 8 $Mj [1] 10 11 12 13 14 15 16 17 $dn [1] "l1" "l2" purrr::transpose。这将为您提供三个向量的列表:

unlist

答案 2 :(得分:1)

这里是一种选择。

library(tidyverse)

groups <- names(ll$ll1)

ll2 <- map(groups, ~unlist(map(ll, .x)))

names(ll2) <- groups

ll2
# $`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"