首页 > 解决方案 > 在R中重新排列矩阵的行

问题描述

我在 R 中创建了以下矩阵


P = as.matrix(expand.grid(0:1, 0:1, 0:1, 0:1))
P = P[-1,]
        Var1 Var2 Var3 Var4
 [1,]    1    0    0    0
 [2,]    0    1    0    0
 [3,]    1    1    0    0
 [4,]    0    0    1    0
 [5,]    1    0    1    0
 [6,]    0    1    1    0
 [7,]    1    1    1    0
 [8,]    0    0    0    1
 [9,]    1    0    0    1
[10,]    0    1    0    1
[11,]    1    1    0    1
[12,]    0    0    1    1
[13,]    1    0    1    1
[14,]    0    1    1    1
[15,]    1    1    1    1

有没有办法安排行P并获得以下内容?

P = matrix(c(1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0),10,4,byrow=TRUE)
     [,1] [,2] [,3] [,4]
 [1,]    1    1    1    1
 [2,]    0    1    1    1
 [3,]    0    0    1    1
 [4,]    0    0    0    1
 [5,]    1    1    1    0
 [6,]    0    1    1    0
 [7,]    0    0    1    0
 [8,]    1    1    0    0
 [9,]    0    1    0    0
[10,]    1    0    0    0

以一般的方式?即,如果我增加列Pas.matrix(expand.grid(0:1, 0:1, 0:1, 0:1, 0:1, 0:1))我想进行等效的重新排列。

标签: r

解决方案


您可以尝试使用以下方法直接创建所需的矩阵:

fun <- function(nc = 4) {
  out <- lapply(rev(seq.int(nc)), function(x) {
    a <- matrix(1L, ncol = x, nrow = x)
    a[lower.tri(a)] <- 0L
    if (x == nc) {
      a
    } else {
      b <- matrix(0L, ncol = nc - x, nrow = nrow(a))
      cbind(a, b)
    }
  })
  do.call(rbind, out)
}

fun(4)
#       [,1] [,2] [,3] [,4]
#  [1,]    1    1    1    1
#  [2,]    0    1    1    1
#  [3,]    0    0    1    1
#  [4,]    0    0    0    1
#  [5,]    1    1    1    0
#  [6,]    0    1    1    0
#  [7,]    0    0    1    0
#  [8,]    1    1    0    0
#  [9,]    0    1    0    0
# [10,]    1    0    0    0

推荐阅读