我想将多个向量连接到单独的列表中,并输出一个矩阵列表。这个想法是将列表中具有相同名称的所有a项目(例如所有项目)通过行连接为矩阵。更为复杂的是,这些向量的长度可以不同,因此rbind实现起来并不容易。矩阵中的缺失值可以附加NAs。
输入清单:
list1 <- list(a = 1:5, b = 6:10, c = 11:15)
list2 <- list(a = 1:4, b = 6:9, c = 11:14)
list3 <- list(a = 1:3, b = 6:8, c = 11:13)
list1
# $a
# [1] 1 2 3 4 5
#
# $b
# [1] 6 7 8 9 10
#
# $c
# [1] 11 12 13 14 15
#
Run Code Online (Sandbox Code Playgroud)
我希望获得的期望输出是一个列表,该列表具有与唯一列表项一样多的矩阵,其中每个矩阵由行绑定的长度不同的向量组成:
# $a
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 4 5
# [2,] 1 2 3 4 NA
# [3,] 1 2 3 NA NA
#
# $b
# [,1] [,2] [,3] [,4] [,5]
# [1,] 6 7 8 9 10
# [2,] 6 7 8 9 NA
# [3,] 6 7 8 NA NA
#
# $c
# [,1] [,2] [,3] [,4] [,5]
# [1,] 11 12 13 14 15
# [2,] 11 12 13 14 NA
# [3,] 11 12 13 NA NA
Run Code Online (Sandbox Code Playgroud)
我将如何编写一个函数,使它也可以扩展到合并具有不同长度的向量的较长列表?
transpose一种选择是lists list,然后将reduce元素list添加到单个数据集cbind.fill,获取转置 ( t) 并将行名称分配给NULL
library(tidyverse)
library(rowr)
list(list1, list2, list3) %>%
transpose %>%
map(~ reduce(.x, cbind.fill, fill = NA) %>%
t %>%
`row.names<-`(NULL))
#$a
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 2 3 4 NA
#[3,] 1 2 3 NA NA
#$b
# [,1] [,2] [,3] [,4] [,5]
#[1,] 6 7 8 9 10
#[2,] 6 7 8 9 NA
#[3,] 6 7 8 NA NA
#$c
# [,1] [,2] [,3] [,4] [,5]
#[1,] 11 12 13 14 15
#[2,] 11 12 13 14 NA
#[3,] 11 12 13 NA NA
Run Code Online (Sandbox Code Playgroud)
或者使用base R
do.call(Map, c(f = function(...) {l1 <- list(...)
do.call(rbind, lapply(l1, `length<-`, max(lengths(l1))))},
mget(paste0("list", 1:3))))
Run Code Online (Sandbox Code Playgroud)