gpt4 book ai didi

r - 将列表中的向量绑定(bind)到单个矩阵列表

转载 作者:行者123 更新时间:2023-12-04 10:33:27 24 4
gpt4 key购买 nike

我想在不同的列表中加入多个向量并输出一个矩阵列表。这个想法是列表中具有相同名称的所有项目,例如所有 a项目,由行连接为矩阵。增加的复杂性是这些向量可以有不同的长度,所以rbind实现起来并不简单;矩阵中的缺失值可以附加 NA s。

例子

输入列表:

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
#

我希望获得的所需输出是一个包含与唯一列表项一样多的矩阵的列表,其中每个矩阵由不同长度的向量组成,这些向量由行限制:

# $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

我将如何编写一个函数来执行此操作,该函数还可以扩展到将更长的列表与不同长度的向量合并?

最佳答案

一种选择是transpose listlist s,然后 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

或使用 base R
do.call(Map, c(f = function(...) {l1 <- list(...)
do.call(rbind, lapply(l1, `length<-`, max(lengths(l1))))},
mget(paste0("list", 1:3))))

关于r - 将列表中的向量绑定(bind)到单个矩阵列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57401290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com