Как сохранить определенные значения в массиве в R? - PullRequest
0 голосов
/ 06 октября 2010

Предположим, у меня есть массив данных,

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 ]

3 голосов
/ 06 октября 2010

На вопрос 2,

Вы можете изменить порядок измерений, затем добавить измерение, представляющее группы для усреднения, а затем применить apply:

tmp <- array( 1:32, c(2,2,8) )
tmp2 <- array( aperm(tmp), c(4,2,2,2) )
apply( tmp2, 2:4, mean )
2 голосов
/ 06 октября 2010

Ответ на Q1:

dat[dat < 0] <- NA

Мы рассматриваем dat, как если бы это был вектор (он есть только с диммингом).

Ответ на Q2:

Следуя хорошему, лаконичному решению Грега, решение, которое я имел в виду при публикации моего комментария ранее, заключалось в следующем (используя 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
0 голосов
/ 06 октября 2010

На вопрос 1:

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

По вопросу 2 см. Решение Грега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...