将向量跨列表绑定到单个矩阵列表

seb*_*rdo 7 r list r-base

我想将多个向量连接到单独的列表中,并输出一个矩阵列表。这个想法是将列表中具有相同名称的所有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)

我将如何编写一个函数,使它也可以扩展到合并具有不同长度的向量的较长列表?

akr*_*run 4

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)