首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向列中添加行的组合

向列中添加行的组合
EN

Stack Overflow用户
提问于 2015-05-10 07:10:42
回答 1查看 68关注 0票数 0

我有17个430阶的方阵和一个维数为92235 x 34的大矩阵。

  1. 对于每个方阵,我希望将每行的值(从1到430)添加到大型矩阵中的列中,只取主对角线上方的值。因此,1,21,4.1,4302,4.2,430.429,430-因此,大矩阵的92235行长(步骤1的一个样本在这里显示http://imgur.com/4SlUenK)
  2. 平方矩阵被转置。
  3. 重复步骤1,但行值将添加到大型矩阵中的下一列中。
  4. 重复步骤1-3 16次,直到填充大矩阵为止。

我该怎么做呢?

提亚

为注释编辑

代码语言:javascript
复制
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

它读取列,然后读取行。相反,我希望读取行然后是列,这样结果应该是:

代码语言:javascript
复制
      [,1]
[1,]    6
[2,]   11
[3,]   16
[4,]   21
[5,]   12
[6,]   17
[7,]   22
[8,]   18
[9,]   23
[10,]  24
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-10 07:33:12

如果有17个方阵('m1','m2',…‘m17’),将它们保存在一个list中,然后使用upper.tritranspose中提取对角线上方的元素和cbind

代码语言:javascript
复制
 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

在这里,我在一个列表中创建了矩阵。

更新

根据数据的行顺序,

代码语言:javascript
复制
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在评论中提到

代码语言:javascript
复制
temp <- t(mat)
temp[lower.tri(temp)]
#[1]  6 11 16 21 12 17 22 18 23 24

您可以像在lapply中一样替换这些步骤。

数据

代码语言:javascript
复制
set.seed(24)
lst1 <- replicate(17, matrix(sample(1:200, 430*430, replace=TRUE), 
    430, 430), simplify=FALSE)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30148662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档