2015-11-23 2 views
2

Учитывая кадр данных, как это:Вычислить среднее из диапазона строк

A <- c(1,2,3,4,NA,6,7,8,9,10,11,12,13,14,15) 
B <- c(NA,NA,NA,20,NA,NA,NA,15,NA,NA,NA,NA,11,NA,9) 
DF <- data.frame(A, B) 

Я хотел бы вычислить среднее для диапазона значений в колонке А, на основе значения в столбце B. В частности, каждый раз, когда в столбце B есть значение, отличное от NA, я хотел бы рассчитать среднее значение диапазона строк 2 выше и 2 ниже в столбце A.

Например, первое значение, отличное от NA в столбце B 20. Поэтому я хотел бы вычислить среднее из двух строк выше (2, 3), два ряда ниже (NA, 6) и соседнюю строку (4). Итак:

mean(2,3,4,NA,6) 

Аналогично, следующий не-NA значение в строке B 15. Какой бы

mean(6,7,8,9,10) 

Таким образом, конечный результат для всего кадра данных будет новый столбец С

DF$C <- c(NA,NA,NA,3.75,NA,NA,NA,8,NA,NA,NA,NA,13,NA,14) 

ответ

4

Вы можете попробовать следующее.

nona <- !is.na(DF$B) 
DF$C <- replace(
    DF$B, 
    nona, 
    vapply(which(nona), function(i) { 
     ii <- (i-2):(i+2) 
     mean(DF$A[ii[ii > 0]], na.rm = TRUE) 
    }, 1) 
) 

Здесь мы находим значение не-NA в столбце B, а затем использовать этот вектор для создания индексов для значений, которые мы хотим найти среднюю для в колонке А, соблюдая осторожность, чтобы удалить любые отрицательные индексы это может произойти, если первое или два значения столбца B не будут NA. Приведенный выше код дает следующий результат для DF.

A B  C 
1 1 NA NA 
2 2 NA NA 
3 3 NA NA 
4 4 20 3.75 
5 NA NA NA 
6 6 NA NA 
7 7 NA NA 
8 8 15 8.00 
9 9 NA NA 
10 10 NA NA 
11 11 NA NA 
12 12 NA NA 
13 13 11 13.00 
14 14 NA NA 
15 15 9 14.00 
3

Вот подход с zoo пакета:

library(zoo) 
width <- 5 # the observation ± 2 

DF$C <- rollapply(DF$A, width, mean, na.rm = TRUE, partial = TRUE) 

# when DF$B is NA, assign NA to corresponding DF$C 
DF$C[is.na(DF$B)] <- NA 

partial = TRUE позволяет вычислять среднее значение с частичным окном в передней и задней частях вектора DF$A, где не может быть размещено все окно (т. первые 2 и последние 2 значения DF$A, где окно размером 5 невозможно).

Смежные вопросы