работа с пропущенными значениями с помощью функции R filter () - PullRequest
4 голосов
/ 18 августа 2011

Я бы хотел обработать пропущенные значения, используя функцию filter() в R.

На самом деле, я хочу вычислить X_t = 1/(2*T+1) * sum(X_i, i = (t-T)...(t+T)), где (X_t) - классический временной ряд, содержащий пропущенные значения. filter() вычисляет суммы за интервалы времени [(t-T);(t+T)], но не дает среднее значений, исключая NA с.

Кто-нибудь имеет представление о том, как справиться с этим?

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Попробуйте:

library(zoo)
x <- 1:10
x[6] <- NA
rollapply(x, 3, mean, na.rm = TRUE)
## [1] 2.0 3.0 4.0 4.5 6.0 7.5 8.0 9.0

Существует множество других аргументов, которые могут вам понадобиться или не понадобиться в зависимости от того, что именно вы хотите получить.См. ?rollapply.

ПЕРЕСМОТРЕН Обновлен ответ на основе более новой версии rollapply, которая допускает упрощение.

1 голос
/ 25 августа 2012

Уловка Саппи не совсем у меня сработала. Вы должны манипулировать начальным вектором, чтобы заставить его работать с Ks больше 1. Вот мой код:

k <- 1  ## Moving average over three points.
x <- c(rep(1,5), NA, rep(1,5)) # input vector
stmp <- c( rep(NA,k), x, rep(NA,k) )
smooth <- sapply((k+1):(k+length(x)), function(i){mean(x[(i-k):(i+k)], na.rm=TRUE)})

Я также добавил оператор функции, чтобы код выполнялся без ошибок. Надеюсь, это поможет:)

0 голосов
/ 18 августа 2011

Если вам нужна простая скользящая средняя, ​​превышающая 2k+1 баллов, вы можете сделать это:

x <- c(rep(1,5), NA, rep(1,5))
k <- 1  ## Moving average over three points.
smooth <- sapply(1:length(x), mean(x[(i-k):(i+k)], na.rm=TRUE))

, что приводит к вектору всех единиц в этом случае.

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