tags:

views:

60

answers:

3

Suppose I have a data array,

dat <- array(NA, c(115,45,248))

Q1: What I do if I want to get a new data array,

datnew <- array(NA, c(115,45,248))

in which, all the positive value remain and the negative value changed to NA?

Q2: What I do if I want to get a new data array,

 datnew <- array(NA,c(115,45,31))

by averaging with the third dimension, but only averaging every 8 values?

Thanks a lot.

+2  A: 

Answer to Q1:

dat[dat < 0] <- NA

We treat dat as if it were a vector (it is but just with dims).

Answer to Q2:

Following Greg's nice, succinct solution, the solution I had in mind when posting my comment earlier was this (using Greg's tmp)

foo <- function(x, grp) aggregate(x, by = list(grp = grp), mean)$x
apply(tmp, 2:1, foo, grp = gl(2,4))

Examples:

Q1

> dat <- array(rnorm(3*3*3), c(3,3,3))
> dat
, , 1

           [,1]       [,2]       [,3]
[1,]  0.1427815  0.1642626 -0.6876034
[2,]  0.6791252  2.1420478 -0.7073936
[3,] -0.9695173 -1.1050933 -0.3068230

, , 2

           [,1]       [,2]       [,3]
[1,]  0.8246182  0.5132398  2.5428203
[2,] -0.4328711  0.9080648 -0.1231653
[3,] -0.7798170 -1.1160706 -0.9237559

, , 3

            [,1]       [,2]       [,3]
[1,] -0.79505298  0.8795420  0.4520150
[2,]  0.04154077 -1.0422061  0.4657002
[3,] -0.67168971  0.7925304 -0.5461143

> dat[dat < 0] <- NA
> dat
, , 1

          [,1]      [,2] [,3]
[1,] 0.1427815 0.1642626   NA
[2,] 0.6791252 2.1420478   NA
[3,]        NA        NA   NA

, , 2

          [,1]      [,2]     [,3]
[1,] 0.8246182 0.5132398 2.542820
[2,]        NA 0.9080648       NA
[3,]        NA        NA       NA

, , 3

           [,1]      [,2]      [,3]
[1,]         NA 0.8795420 0.4520150
[2,] 0.04154077        NA 0.4657002
[3,]         NA 0.7925304        NA

Q2

> foo <- function(x, grp) aggregate(x, by = list(grp = grp), mean)$x
> apply(tmp, 2:1, foo, grp = gl(2,4))
, , 1

     [,1] [,2]
[1,]    7    9
[2,]   23   25

, , 2

     [,1] [,2]
[1,]    8   10
[2,]   24   26
> all.equal(apply(tmp, 2:1, foo, grp = gl(2,4)), apply( tmp2, 2:4, mean ))
[1] TRUE
Gavin Simpson
Q1 solved! Thanks!
didimichael
+3  A: 

For question 2,

you can reverse the order of the dimensions, then add a dimension representing the groups to average over, then use apply:

tmp <- array( 1:32, c(2,2,8) )
tmp2 <- array( aperm(tmp), c(4,2,2,2) )
apply( tmp2, 2:4, mean )
Greg Snow
Nice answer, Greg. Took me a little while to grep what that was doing.
Gavin Simpson
A: 

For question 1:

tmp2 <- ifelse(tmp1<0,tmp1,NA)

For question 2 see Greg's solution.

Andrew Redd
Thank you all! Problem solved!
didimichael