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's를 처리하지 않는다고 말합니다 - 아마'cumsum'을 사용했을 것입니다. 'rollsum '의 경우 인 것처럼 보입니다. –
의미가 있습니다. 이상한 것은 오류 대신 잘못된 결과를 산출합니다. – andrew
아마도'RcppRoll :: roll_sum'이 대안이 될 수도 있습니다. – Rentrop