更改矩阵维度

时间:2016-07-02 15:54:44

标签: r matrix

让我们做一个可复制的例子:

这是我的初始矩阵

d<- matrix(1:80,,5)
d
     [,1] [,2] [,3] [,4] [,5]
[1,]    1   17   33   49   65
[2,]    2   18   34   50   66
[3,]    3   19   35   51   67
[4,]    4   20   36   52   68
[5,]    5   21   37   53   69
[6,]    6   22   38   54   70
[7,]    7   23   39   55   71
[8,]    8   24   40   56   72
[9,]    9   25   41   57   73
[10,]   10   26   42   58   74
[11,]   11   27   43   59   75
[12,]   12   28   44   60   76
[13,]   13   29   45   61   77
[14,]   14   30   46   62   78
[15,]   15   31   47   63   79
[16,]   16   32   48   64   80

我想重塑我的矩阵,将每个colomn减少4并将数字增加,如下所示:

new.d
    [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
[5,]   17   21   25   29
[6,]   18   22   26   30
[7,]   19   23   27   31
[8,]   20   24   28   32
[9,]   33   37   41   45
[10,]   34   38   42   46
[11,]   35   39   43   47
[12,]   36   40   44   48
[13,]   49   53   57   61
[14,]   50   54   58   62
[15,]   51   55   59   63
[16,]   52   56   60   64
[17,]   65   69   73   77
[18,]   66   70   74   78
[19,]   67   71   75   79
[20,]   68   72   76   80

有任何帮助吗?感谢

5 个答案:

答案 0 :(得分:3)

使用矩阵索引

# number of new columns
cols <- 4
matrix(t(d), ncol=cols)[matrix(1:(length(d)/cols), ncol=ncol(d), byrow=TRUE), ]
# This almost gets us there but rows are not in correct order
matrix(t(d), ncol=cols)
 #      [,1] [,2] [,3] [,4]
 # [1,]    1    5    9   13
 # [2,]   17   21   25   29
 # [3,]   33   37   41   45
 # [4,]   49   53   57   61
 # [5,]   65   69   73   77
 # [6,]    2    6   10   14
 # [7,]   18   22   26   30
 # [8,]   34   38   42   46

# use this t index / group the relevant rows
c(matrix(1:(length(d)/cols), ncol=ncol(d), byrow=TRUE))
#  [1]  1  6 11 16  2  7 12 17  3  8 13 18  4  9 14 19  5 10 15 20

答案 1 :(得分:3)

又一种方法:

n = 4
matrix(aperm(array(d, c(n, nrow(d)/n, ncol(d))), c(1, 3, 2)), ncol = nrow(d)/n)

答案 2 :(得分:2)

我们可以尝试

d1 <- array(d, c(4, 4, 5))
do.call(rbind, lapply(seq(dim(d1)[3]), function(i) d1[,,i]))
#       [,1] [,2] [,3] [,4]
# [1,]    1    5    9   13
# [2,]    2    6   10   14
# [3,]    3    7   11   15
# [4,]    4    8   12   16
# [5,]   17   21   25   29
# [6,]   18   22   26   30
# [7,]   19   23   27   31
# [8,]   20   24   28   32
# [9,]   33   37   41   45
#[10,]   34   38   42   46
#[11,]   35   39   43   47
#[12,]   36   40   44   48
#[13,]   49   53   57   61
#[14,]   50   54   58   62
#[15,]   51   55   59   63
#[16,]   52   56   60   64
#[17,]   65   69   73   77
#[18,]   66   70   74   78
#[19,]   67   71   75   79
#[20,]   68   72   76   80

答案 3 :(得分:0)

另一个简单的解决方案:

matrix <- matrix(seq(1,16), ncol = 4)
rbind(matrix, 
      16+matrix, 
      32+matrix, 
      48+matrix, 
      64+matrix)

或:

matrix <- matrix(seq(1,16), ncol = 4)
do.call(rbind, lapply(0:4, function(x){
    16*x+matrix
  })
)

答案 4 :(得分:0)

我们可以直接这样做

do.call(rbind,lapply(1:ncol(d),function(t) matrix(d[,t],ncol = 4)))