我有17个430阶的矩阵和一个92235 x 34的大矩阵
对于每个方阵,我希望将每行的值(从1到430)添加到大矩阵中的一列,只取这些值在主对角线上方。所以[1,2] [1,3] [1,4] .. [1,430] [2,3] [2,4] ... [2,430] ... [429,430] - 因此,92235行大矩阵的长度(步骤1的样本显示在这里http://imgur.com/4SlUenK)
方阵矩阵转换
重复步骤1,但行值被添加到大矩阵的下一列
重复步骤1-3 16次,直到填满大矩阵
我该怎么做?
TIA
编辑评论
mat = matrix(1:25,5,5)
mat
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
mat2 = cbind(mat[upper.tri(mat)])
mat2
[,1]
[1,] 6
[2,] 11
[3,] 12
[4,] 16
[5,] 17
[6,] 18
[7,] 21
[8,] 22
[9,] 23
[10,] 24
这会读取列然后是行。相反,我想读取行然后列,以便结果应该是:
[,1]
[1,] 6
[2,] 11
[3,] 16
[4,] 21
[5,] 12
[6,] 17
[7,] 22
[8,] 18
[9,] 23
[10,] 24
答案 0 :(得分:3)
如果您有17个方形矩阵(' m1',' m2',...' m17'),请将它们保存在list
中然后使用upper.tri
使用cbind
transpose
lst1 <- mget(paste0('m', 1:17))
Out <- do.call(cbind,lapply(lst1, function(x) {x1 <- t(x)
cbind(x[upper.tri(x)], x1[upper.tri(x1)]) }))
dim(Out)
#[1] 92235 34
这里我在列表中创建了矩阵。
根据数据的行顺序,
mat1 <- mat
mat1[lower.tri(mat1, diag=TRUE)] <- NA
as.vector(na.omit(unlist(tapply(mat1, row(mat1), FUN=I))))
#[1] 6 11 16 21 12 17 22 18 23 24
或者@David Arenburg在评论中提到
temp <- t(mat)
temp[lower.tri(temp)]
#[1] 6 11 16 21 12 17 22 18 23 24
您可以替换lapply
。
set.seed(24)
lst1 <- replicate(17, matrix(sample(1:200, 430*430, replace=TRUE),
430, 430), simplify=FALSE)