这是我的数据示例。
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函数可以在这里工作,但是我还没有找到解决方案。
答案 0 :(得分:7)
使用pmap
中的purrr
。 pmap
接受输入列表(在本例中为两个列表),并将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"