我有一个矩阵:
b<-matrix(NA,ncol=100,nrow=10)
和矢量列表:
load("https://dl.dropboxusercontent.com/u/22681355/a.Rdata")
此列表包含100个向量。我想将列表中的每个向量分配给矩阵的一列。这可能吗?
答案 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