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