R - Добавление вектора / массива - PullRequest
1 голос
/ 28 марта 2012

У меня небольшие проблемы с векторными или массивными операциями.

У меня есть три 3D-массива, и я хочу найти их среднее значение.Как я могу это сделать?мы не можем использовать mean(), поскольку он возвращает только одно значение.

Более важным является то, что некоторые ячейки в массивах имеют NA, что означает, если я просто добавлю их как

A = (B + C + D)/3 

Результаты также покажут NA.

Как я могу позволить ему распознать, если ячейка является NA, тогда просто пропустите ее.

Как

 A = c(NA, 10, 15, 15, NA)
 B = c(10, 15, NA, 22, NA)
 C = c(NA, NA, 20, 26, NA)

Я хочу, чтобы результат усреднения этих векторов был

(10, (10+15)/2, (15+20)/2, (15+22+26)/3, NA)

Мы также не можем использовать na.omit, потому что он будет перемещать порядок индексов.

Этосоответствующий код.Я хотел бы, чтобы это было полезно.

for (yr in 1950:2011) {
    temp_JFM <- sst5_sst2[,,year5_sst2==yr & (month5_sst2>=1 & month5_sst2<=3)]
       k = 0
       jfm=4*k+1
    for (i in 1:72) {
        for (j in 1:36) {
            iposst5_sst2[i,j,jfm] <- (temp_JFM[i,j,1]+temp_JFM[i,j,2]+temp_JFM[i,j,3])/3
        }
    }      
}

Спасибо.

Это уже решено.

Самый простой способ исправить это может бытьпоказано ниже.

iposst5_sst2[i,j,jfm] <- mean(temp_JFM[i,j,],na.rm=TRUE)

Ответы [ 2 ]

7 голосов
/ 28 марта 2012

Я не совсем уверен, каков ваш желаемый результат, но я предполагаю, что вы действительно хотите построить не три 3D-массива, а один 4D-массив, который затем вы можете использовать apply.

Примерно так:

#Three 3D arrays...
A <- array(runif(1:27),dim = c(3,3,3))
B <- array(runif(1:27),dim = c(3,3,3))
C <- array(runif(1:27),dim = c(3,3,3))

#Become one 4D array
D <- array(c(A,B,C),dim = c(3,3,3,3))

#Now we can simply apply the function mean
# and use it's na.rm = TRUE argument.
apply(D,1:3,mean,na.rm = TRUE)
2 голосов
/ 28 марта 2012

Вот пример, который делает вектор из трех значений, что делает na.omit пригодным для использования:

vectorAverage <- function(A,B,C) {
    Z <- rep(NA, length(A))

    for (i in 1:length(A)) {
        x <- na.omit(c(A[i],B[i],C[i]))
        if (length(x) > 0) Z[i] = mean(x)
    }
    Z
}

В результате:

vectorAverage(A,B,C)
[1] 10.0 12.5 17.5 21.0   NA

Отредактировано: пропущено NaN ввывод первой версии.

...