2016-10-11 72 views
0

使用zoo中的rollsum函數,我看到NAs代替我期望的有效值。 rollapply使用sum按預期工作,但rollsum不會:rolum產生意想不到的不適用

library(zoo) 
x <- c(1,2,3,NA,NA,4,5,6) 
x 
[1] 1 2 3 NA NA 4 5 6 
rollapply(x, 3, FUN=sum, fill=NA) 
[1] NA 6 NA NA NA NA 15 NA 
rollsum(x, 3, fill=NA) 
[1] NA 6 NA NA NA NA NA NA 

我是否錯過了一些東西,或者這是一個優化中的bug rollsum正在使用?

+0

'?zoo :: rollersum'指出'rollmean'不處理'NA's - 可能是因爲使用了'cumsum'。似乎也是'rollum'的情況。 –

+0

有道理。奇怪它會產生錯誤的結果而不是錯誤。 – andrew

+1

也許'RcppRoll :: roll_sum'可以替代你 – Rentrop

回答

1

rollmean和rollsum的默認方法不處理包含NAs的輸入。在這種情況下,請使用rollapply。

0

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))]

rollsumzoo包中的一項新功能,尚未處理NA的問題,所以我建議留在rollapply

相關問題