将矢量列表转换为矩阵

时间:2014-02-11 13:04:38

标签: r matrix

我有一个矩阵:

b<-matrix(NA,ncol=100,nrow=10)

和矢量列表:

load("https://dl.dropboxusercontent.com/u/22681355/a.Rdata")

此列表包含100个向量。我想将列表中的每个向量分配给矩阵的一列。这可能吗?

4 个答案:

答案 0 :(得分:1)

查看?do.call?cbind,例如:

## create an example list with 3 vectors
l <- list(c(1:3), c(4:6), c(7:9))

## columnwise binding of all vectors in the list `l`
do.call(cbind, l)

或者您可以使用简单的for循环:

for (i in seq(along=l)) {
   n <- length(l[[i]])
   b[seq(n), i] <- l[[i]]
}

答案 1 :(得分:1)

这样的事情(不记得我从哪里得到这个):

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

答案 2 :(得分:1)

一个技巧是首先“延长”向量,使它们的长度相同(在你的情况下为10)。在这里,我首先创建虚拟数据(只有10列,因此我可以轻松地显示结果,但这延伸到您的100列情况):

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

现在加长,cbind

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

答案 3 :(得分:1)

如果你调用的位置大于向量的长度,你会在'额外位置'得到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