假设我有一个数据数组,
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个值?
非常感谢。
答案 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))
> 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
> 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的解决方案。