How can I reshape a matrix in base R without a for loop?

I have some data that has the following dimension
[100, 2, 100]. It represents 100 rows of observations, 2 columns of variables, repeated in 100 experiments.

I would like to have the data in a matrix with the dimensions [10000, 2], where I have effectively eliminated the concept of experiments.

Something like .reshape in python.

I found the reshape package. However I wonder if it can be done without it.
Is there a more elegant way to do this in base R than a for loop?

>Solution :

Let’s start from a smaller example with array m

m <- array(rep(1:100, 5), c(10, 2, 5))

which is a 3-D array

> m
, , 1

      [,1] [,2]
 [1,]    1   11
 [2,]    2   12
 [3,]    3   13
 [4,]    4   14
 [5,]    5   15
 [6,]    6   16
 [7,]    7   17
 [8,]    8   18
 [9,]    9   19
[10,]   10   20

, , 2

      [,1] [,2]
 [1,]   21   31
 [2,]   22   32
 [3,]   23   33
 [4,]   24   34
 [5,]   25   35
 [6,]   26   36
 [7,]   27   37
 [8,]   28   38
 [9,]   29   39
[10,]   30   40

, , 3

      [,1] [,2]
 [1,]   41   51
 [2,]   42   52
 [3,]   43   53
 [4,]   44   54
 [5,]   45   55
 [6,]   46   56
 [7,]   47   57
 [8,]   48   58
 [9,]   49   59
[10,]   50   60

, , 4

      [,1] [,2]
 [1,]   61   71
 [2,]   62   72
 [3,]   63   73
 [4,]   64   74
 [5,]   65   75
 [6,]   66   76
 [7,]   67   77
 [8,]   68   78
 [9,]   69   79
[10,]   70   80

, , 5

      [,1] [,2]
 [1,]   81   91
 [2,]   82   92
 [3,]   83   93
 [4,]   84   94
 [5,]   85   95
 [6,]   86   96
 [7,]   87   97
 [8,]   88   98
 [9,]   89   99
[10,]   90  100

If you want to reshape it into a 50x2 array, we can try

> apply(m, 2, `[`)
      [,1] [,2]
 [1,]    1   11
 [2,]    2   12
 [3,]    3   13
 [4,]    4   14
 [5,]    5   15
 [6,]    6   16
 [7,]    7   17
 [8,]    8   18
 [9,]    9   19
[10,]   10   20
[11,]   21   31
[12,]   22   32
[13,]   23   33
[14,]   24   34
[15,]   25   35
[16,]   26   36
[17,]   27   37
[18,]   28   38
[19,]   29   39
[20,]   30   40
[21,]   41   51
[22,]   42   52
[23,]   43   53
[24,]   44   54
[25,]   45   55
[26,]   46   56
[27,]   47   57
[28,]   48   58
[29,]   49   59
[30,]   50   60
[31,]   61   71
[32,]   62   72
[33,]   63   73
[34,]   64   74
[35,]   65   75
[36,]   66   76
[37,]   67   77
[38,]   68   78
[39,]   69   79
[40,]   70   80
[41,]   81   91
[42,]   82   92
[43,]   83   93
[44,]   84   94
[45,]   85   95
[46,]   86   96
[47,]   87   97
[48,]   88   98
[49,]   89   99
[50,]   90  100

Leave a Reply