[R] Using apply with more than one matrix

David Winsemius dwinsemius at comcast.net
Thu May 1 05:45:34 CEST 2014


On Apr 30, 2014, at 6:03 PM, Waichler, Scott R wrote:

> Here is a working example with no random parts.  Thanks for your patience and if I'm still off the mark with my presentation I'll drop the matter.  
> 
> v <- c(NA, 1.5, NA, NA,
>       NA, 1.1, 0.5, NA,
>       NA, 1.3, 0.4, 0.9)
> a1 <- array(v, dim=c(2,2,3))
> m1 <- matrix(c(NA, 1.5, 2.1, NA), ncol=2, byrow=T)
> m2 <- matrix(c(1.56, 1.64, 1.16, 2.92), ncol=2)
> condition1 <- !is.na(m1)& m1 > m2
> 
> ans <- matrix(NA, ncol=2, nrow=2) # initialize
> for(i in 1:2) {
>  for(j in 1:2) {
>    ind.not.na <- which(!is.na(a1[i,j,]))
>    if(condition1[i,j] && length(ind.not.na) > 0) ans[i,j] <- a1[i,j,ind.not.na[1]] + m2[i,j]
>  }
> }
> ans
>     [,1] [,2]
> [1,]   NA 1.66
> [2,] 3.14   NA

I would ask you to look at this loop-free approach and ask if this is not equally valid?

ans <- matrix(NA, ncol=2, nrow=2) 
ind.not.na <- which(!is.na(a1))
ans[] <- condition1*a1[,,ind.not.na[1]]+ m2  # two matrices of equal dimensions, one logical.
 ans
     [,1] [,2]
[1,]   NA 1.66
[2,] 2.74   NA
> 
> Let me try asking again in words.  If I have multiple matrices or slices of 3d arrays that are the same dimension, is there a way to pass them all to apply, and have apply take care of looping through i,j?

I don't think `apply` is the correct function for this. Either `mapply` or basic matrix operation seem more likely to deliver correct results:


> I understand that apply has just one input object x.  I want to work on more than one array object at once using a custom function that has this characteristic:  in order to compute the answer at i,j I need a result from higher order array at the same i,j.  

If you want to iterate over matrix indices you can either use the vector version e.g. m2[3] or the matrix version, m2[2,1[.

vec <- sapply(seq(length(m2) , function(idx) m2[idx]*condition1[idx] )



> This is what I tried to demonstrate in my example above.
> 
> Thanks,
> Scott

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list