将行组合添加到列

时间:2015-05-10 07:10:42

标签: r matrix

我有17个430阶的矩阵和一个92235 x 34的大矩阵

  1. 对于每个方阵,我希望将每行的值(从1到430)添加到大矩阵中的一列,只取这些值在主对角线上方。所以[1,2] [1,3] [1,4] .. [1,430] [2,3] [2,4] ... [2,430] ... [429,430] - 因此,92235行大矩阵的长度(步骤1的样本显示在这里http://imgur.com/4SlUenK

  2. 方阵矩阵转换

  3. 重复步骤1,但行值被添加到大矩阵的下一列

  4. 重复步骤1-3 16次,直到填满大矩阵

  5. 我该怎么做?

    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
    

1 个答案:

答案 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)