Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R subsetting and assigning in a multidimensional array

I am working with R with a 3D dimensional array. I am trying to use it like a set of 2D matrix for different time instants.

I have find a behavior that I really don't understand and I will like to know why is happening. I have tried to find a explanation here and in other places but until now I still have the doubt.

I have my 3D array like this:

array3D=array(1:45,c(5,3,3))

And as I expected I can access to an individual 2D matrix

 array3D[1,,]
     [,1] [,2] [,3]
[1,]    1   16   31
[2,]    6   21   36
[3,]   11   26   41

However trying to access to two 2D matrices I don't get what I expect

 array3D[1:2,,]
, , 1

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    2    7   12

, , 2

     [,1] [,2] [,3]
[1,]   16   21   26
[2,]   17   22   27

, , 3

     [,1] [,2] [,3]
[1,]   31   36   41
[2,]   32   37   42

I have find that I can solve this using aperm(array3D[1:2,,]) but I don't understand what is doing.

And the other problem is when I try to do an assignment, that I don't understand why this doesn't works

array3D[1:2,,]=matrix(9:1,3,3)
array3D[1,,]
     [,1] [,2] [,3]
[1,]    9    3    6
[2,]    7    1    4
[3,]    5    8    2

I think that I can solve this with a loop or maybe with aaply as I read here, but I think that if I want to work with 3D arrays is really important to understand what is happening. If someone can point me to the right direction I will be really happy.

I have tried to find the answer here and reading http://adv-r.had.co.nz/ but so far no luck.

Update

I have found that everything works if instead of using the first index I use the last one, but I still doesn't understand why. Is something inherent to R? Is possible to use the first one in some other way?

array3D=array(1:45,c(3,3,5))
array3D[,,1:2]=matrix(9:1,3,3)
array3D[,,2]
     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    2
[3,]    7    4    1
like image 643
Cohet Avatar asked Oct 30 '22 08:10

Cohet


1 Answers

I think it's not quite clear what you want to achieve, but here are some examples: On your first point, you can select two of the three three-by-three matrices in the z-direction by doing:

array3D[,,1:2]

And accordingly, you can replace with an array of appropriate size:

array3D[,,1:2] <- array(18:1,c(3,3,2))

About your question on why you have to use the third index: Think about it like the z-direction in a 3D coordinate system. The rows would be the x-direction (vertical) and the columns the y-direction (horizontal). When indexing array3D[1:2,,] you selected the first two rows, while keeping everything in the x and z direction.

like image 117
David Heckmann Avatar answered Nov 09 '22 14:11

David Heckmann