Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading