rollsum
определяется в rollmean.R
следующим образом:
rollsum <- function(x, k, fill = if (na.pad) NA, na.pad = FALSE,
align = c("center", "left", "right"), ...) {
UseMethod("rollsum")
}
где метод:
rollsum.zoo <- function(x, k, fill = if (na.pad) NA, na.pad = FALSE,
align = c("center", "left", "right"), ...) {
if (!missing(na.pad)) warning("na.pad is deprecated. Use fill.")
align <- match.arg(align)
if (length(dim(x)) == 2) {
# merge is the only zoo specific part of this method
out <- do.call("merge", c(lapply(1:NCOL(x), function(i) {
rollsum(x[, i, drop = TRUE], k, fill = fill, align = align, ...)
}), all = FALSE))
if (ncol(x) == 1) dim(out) <- c(length(out), 1)
colnames(out) <- colnames(x)
return(out)
}
n <- length(x)
stopifnot(k <= n)
ix <- switch(align,
"left" = { 1:(n-k+1) },
"center" = { floor((1+k)/2):ceiling(n-k/2) },
"right" = { k:n })
xu <- unclass(x)
y <- xu[k:n] - xu[c(1, seq_len(n-k))] # difference from previous
y[1] <- sum(xu[1:k]) # find the first
# sum precomputed differences
rval <- cumsum(y)
x[ix] <- rval
na.fill(x, fill = fill, ix)
}
Если вы пошагово функции вы увидите, что это на самом деле не из-за cumsum
, что в результате оценивает NA, где вы ожидали бы 15 (или, по крайней мере, это не первая причина этого), если бы вы исправили текущую проблему, возможно, cumsum
также вызовет проблему, я не знаю). Это линия
y <- xu[k:n] - xu[c(1, seq_len(n-k))]
.
rollsum
является новой функцией в пакете zoo
и еще не обрабатывает NA, поэтому я предлагаю остановиться с rollapply
.
'? Zoo :: rollsum' утверждает, что' rollmean' не обрабатывает 'NA' - возможно, из-за использования 'cumsum'. Кажется, что и для 'rollsum' тоже. –
Имеет смысл. Странно, что он производит неверный результат вместо ошибки. – andrew
Возможно, «RcppRoll :: roll_sum» может быть альтернативой вам – Rentrop