我有以下列表列表:
nfoo <- list(a = list(x = 1:3, y = 11:13), b = list(x = 1:3, y = 100:102))
它看起来像这样:
> nfoo
$a
$a$x
[1] 1 2 3
$a$y
[1] 11 12 13
$b
$b$x
[1] 1 2 3
$b$y
[1] 100 101 102
我要做的是将列表与列表合并,结果:
$a
[1] 1 2 3 11 12 13
$b
[1] 1 2 3 100 101 102
我该如何实现?
答案 0 :(得分:3)
我们可以将lapply
与unlist
一起使用
lapply(nfoo, unlist, use.names = FALSE)
#$a
#[1] 1 2 3 11 12 13
#$b
#[1] 1 2 3 100 101 102
使用purrr
,我们可以使用map
和flatten.*
library(purrr)
map(nfoo, flatten_int)
答案 1 :(得分:2)
如果我们知道foo
的每个子列表包含向量x
和y
(对于本示例中的示例来说是正确的),则:
lapply(foo, with, c(x, y))
给予:
$a
[1] 1 2 3 11 12 13
$b
[1] 1 2 3 100 101 102
答案 2 :(得分:1)
将lapply
与docall
和连接功能(也适用于列表)一起使用:
output <- lapply(nfoo, function(x) do.call(c, x))
output
$a
x1 x2 x3 y1 y2 y3
1 2 3 11 12 13
$b
x1 x2 x3 y1 y2 y3
1 2 3 100 101 102
答案 3 :(得分:1)
使用lapply
遍历您的列表,然后使用unlist
将每个列表向量化:
lapply(nfoo, unlist)
答案 4 :(得分:1)
library(tidyverse)
nfoo%>%map(unlist)
# $a
# x1 x2 x3 y1 y2 y3
# 1 2 3 11 12 13
#
# $b
# x1 x2 x3 y1 y2 y3
# 1 2 3 100 101 102
答案 5 :(得分:1)
为完整性起见,还有另一种变体在Reduce()
中使用lapply()
lapply(nfoo, Reduce, f = c)
$a [1] 1 2 3 11 12 13 $b [1] 1 2 3 100 101 102
答案 6 :(得分:1)
使用do.call
。
Map(do.call, nfoo, w="c")
# $a
# x1 x2 x3 y1 y2 y3
# 1 2 3 11 12 13
#
# $b
# x1 x2 x3 y1 y2 y3
# 1 2 3 100 101 102