[R] Index matrix to pick elements from 3-dimensional matrix

Tony Plate tplate at acm.org
Tue Apr 26 19:27:08 CEST 2005


I'm assuming what you want to do is randomly sample from slices of A 
selected on the 3-rd dimension, as specified by J.  Here's a way that 
uses indexing by a matrix.  The cbind() builds a three column matrix of 
indices, the first two of which are randomly selected.  The use of 
replace() is to make the result have the same attributes, e.g., dim and 
dimnames, as J.

 > A <- array(letters[1:12],c(2,2,3))
 > J <- matrix(c(1,2,3,3),2,2)
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "b"  "l"
[2,] "f"  "k"
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "b"  "l"
[2,] "h"  "i"
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "c"  "l"
[2,] "h"  "k"
 >

-- Tony Plate

Robin Hankin wrote:
> Hello Juhana
> 
> try this (but there must be a better way!)
> 
> 
> 
> stratified.select <- function(A,J){
>   out <- sapply(J,function(i){sample(A[,,i],1)})
>   attributes(out) <- attributes(J)
>   return(out)
> }
> 
> A <- array(letters[1:12],c(2,2,3))
> J <- matrix(c(1,2,3,3),2,2)
> 
> 
> R>  stratified.select(A,J)
>      [,1] [,2]
> [1,] "b"  "i"
> [2,] "g"  "k"
> R>   stratified.select(A,J)
>      [,1] [,2]
> [1,] "d"  "j"
> [2,] "f"  "l"
> R>
> 
> 
> best wishes
> 
> Robin
> 
> 
> 
> 
> On Apr 26, 2005, at 05:16 am, juhana vartiainen wrote:
> 
>> Hi all
>>
>> Suppose I have a dim=c(2,2,3) matrix A, say:
>>
>> A[,,1]=
>> a b
>> c d
>>
>> A[,,2]=
>> e f
>> g h
>>
>> A[,,3]=
>> i j
>> k l
>>
>> Suppose that I want to create a 2x2 matrix X, which picks elements 
>> from the above-mentioned submatrices according to an index matrix J 
>> referring to the "depth" dimension:
>> J=
>> 1 3
>> 2 3
>>
>> In other words, I want X to be
>> X=
>> a j
>> g l
>>
>> since the matrix J says that the (1,1)-element should be picked from 
>> A[,,1], the (1,2)-element should be picked from A[,,3], etc.
>>
>> I have A and I have J. Is there an expression in A and J that creates X?
>>
>> Thanks
>>
>> Juhana
>>
>> juhana at fief.se
>>
>> -- 
>> Juhana Vartiainen
>>
>> docent in economics
>> Director, FIEF (Trade Union Foundation for Economic Research, 
>> Stockholm), http://www.fief.se
>> gsm +46 70 360 9915
>> office +46 8 696 9915
>> email juhana at fief.se
>> homepage http://www.fief.se/staff/Juhana/index.html
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide! 
>> http://www.R-project.org/posting-guide.html
>>
>>
> -- 
> Robin Hankin
> Uncertainty Analyst
> Southampton Oceanography Centre
> European Way, Southampton SO14 3ZH, UK
>  tel  023-8059-7743
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list