2016-10-11 3 views
0

zoorollsum 함수를 사용하면 유효한 값으로 예상되는 대신에 NA가 표시됩니다. 예상대로 sum 작품을 사용 rollapply하지만 rollsum하지 않습니다 :예기치 않은 NA를 생성하는 롤 수

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 

뭔가가 누락되었거나 최적화에 버그가 있습니까? rollsum이 (가) 사용하고 있습니까? 다음과 같이

+0

'? zoo :: rollsum'은'rollmean'은'NA's를 처리하지 않는다고 말합니다 - 아마'cumsum'을 사용했을 것입니다. 'rollsum '의 경우 인 것처럼 보입니다. –

+0

의미가 있습니다. 이상한 것은 오류 대신 잘못된 결과를 산출합니다. – andrew

+1

아마도'RcppRoll :: roll_sum'이 대안이 될 수도 있습니다. – Rentrop

답변

1

rollmean 및 rollsum의 기본 방법은 NAs가 포함 된 입력을 처리하지 않습니다. 이 경우에는 대신 rollapply를 사용하십시오.

0

rollsumrollmean.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으로 머무르는 것이 좋습니다.

관련 문제