R 将向量列表转换为矩阵

R 将向量列表转换为矩阵,r,matrix,R,Matrix,我有一个矩阵: b<-matrix(NA,ncol=100,nrow=10) 此列表包含100个向量。我想将列表中的每个向量分配给矩阵的一列。这可能吗?请查看“do.call”和“cbind”,例如: 像这样的东西不记得我从哪里得到的: cbind.fill <- function(nm) { nm <- lapply(nm, as.matrix) n <- max(sapply(nm, nrow)) do.call(cbind, lapply(

我有一个矩阵:

b<-matrix(NA,ncol=100,nrow=10)
此列表包含100个向量。我想将列表中的每个向量分配给矩阵的一列。这可能吗?

请查看“do.call”和“cbind”,例如:


像这样的东西不记得我从哪里得到的:

cbind.fill <- function(nm) {
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow))
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - nrow(x), ncol(x)))))
}

l <- list(c(1:3), c(4:8), c(7:9))
cbind.fill(l)

## > cbind.fill(l)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## [4,]   NA    7   NA
## [5,]   NA    8   NA

一个技巧是首先延长向量,使它们在你的例子10中都是相同的长度。在这里,我首先只创建10列虚拟数据,以便轻松显示结果,但这扩展到了100列的情况:

set.seed(1)
lst <- replicate(10, sample(1:100, sample(5:10, 1)))   # 10 vectors, length 5-10
就是这样:

#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#  [1,]   38   63  100   39   19   65   87   41    9    78
#  [2,]   57    7   38   87   82   78   44   91   87    96
#  [3,]   90   21   77   34   66   55   24   29   34    43
#  [4,]   20   18   91   47   78   52    7   45   82    70
#  [5,]   87   66   21   58   11   76   10   32   98    39
#  [6,]   98   37   62   NA   69    3   31   62   32    31
#  [7,]   NA   73   12   NA   39   45   49   25   45    72
#  [8,]   NA   47   25   NA   NA   69   NA   97   83    NA
#  [9,]   NA   NA   36   NA   NA   64   NA   NA   80    NA
# [10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA

如果你调用一个大于向量长度的位置,你在“额外位置”中得到NA。因此,一个简单的mapply可以完成以下工作:

set.seed(1)
lst <- replicate(10, sample(1:100, sample(5:10, 1))) # Simulating data (Thanks @BrodieG!)

mapply(function(x) x[1:10], lst) # You just need change tha maximium length

这似乎是可行的,但由于并非所有向量的长度都相等,我得到了错误:警告消息:在函数中…,deparse.level=1:结果行数不是向量长度arg的倍数1@user2733997:在这种情况下,可以使用简单的for循环。请查看我的编辑。我无法加载您的数据。
set.seed(1)
lst <- replicate(10, sample(1:100, sample(5:10, 1)))   # 10 vectors, length 5-10
lst <- lapply(lst, function(x) { length(x) <- 10; x }) # make all length 10
do.call(cbind, lst)
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#  [1,]   38   63  100   39   19   65   87   41    9    78
#  [2,]   57    7   38   87   82   78   44   91   87    96
#  [3,]   90   21   77   34   66   55   24   29   34    43
#  [4,]   20   18   91   47   78   52    7   45   82    70
#  [5,]   87   66   21   58   11   76   10   32   98    39
#  [6,]   98   37   62   NA   69    3   31   62   32    31
#  [7,]   NA   73   12   NA   39   45   49   25   45    72
#  [8,]   NA   47   25   NA   NA   69   NA   97   83    NA
#  [9,]   NA   NA   36   NA   NA   64   NA   NA   80    NA
# [10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
set.seed(1)
lst <- replicate(10, sample(1:100, sample(5:10, 1))) # Simulating data (Thanks @BrodieG!)

mapply(function(x) x[1:10], lst) # You just need change tha maximium length