如何在R中的数组中保留某些值?

时间:2010-10-06 16:02:19

标签: r

假设我有一个数据数组,

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

Q1:如果我想获得一个新的数据阵列,我会怎么做,

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

其中,所有正值保持不变,负值变为NA

Q2:如果我想获得一个新的数据阵列,我会怎么做,

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

通过平均第三维,但只平均每8个值?

非常感谢。

3 个答案:

答案 0 :(得分:3)

问题2,

你可以颠倒维度的顺序,然后添加一个代表要平均的组的维度,然后使用apply:

tmp <- array( 1:32, c(2,2,8) )
tmp2 <- array( aperm(tmp), c(4,2,2,2) )
apply( tmp2, 2:4, mean )

答案 1 :(得分:2)

回答Q1:

dat[dat < 0] <- NA

我们将dat视为一个向量(它只是用于dims)。

回答Q2:

遵循Greg简洁明了的解决方案,我在发布评论时想到的解决方案就是这个(使用Greg的tmp

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

示例:

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

答案 2 :(得分:0)

问题1:

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

对于问题2,请参阅Greg的解决方案。