【问题标题】:How to keep certain values in an array in R?如何将某些值保留在R中的数组中?
【发布时间】:2010-10-06 16:02:19
【问题描述】:

假设我有一个数据数组,

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 个值?

非常感谢。

【问题讨论】:

  • 你能多解释一下 Q2 吗?例如,使用array(rnorm(3*3*9), c(3,3,9)) 下降到一个暗淡的数组c(3,3,3) 平均每三个值,而不是你更大的例子。 “每 8 个值”是什么意思?在我的较小示例中,我们有 9 个 3x3 矩阵组成数组。您要平均哪些值?我有两种可能的解决方案,两者都不同,是否合适取决于您如何解读 Q2。

标签: r


【解决方案1】:

对于问题 2,

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

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

【讨论】:

  • 很好的答案,格雷格。我花了一点时间来 grep 那在做什么。
【解决方案2】:

Q1 的答案:

dat[dat < 0] <- NA

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

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

【讨论】:

    【解决方案3】:

    对于问题 1:

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多