rollum产生意想不到的NA

时间:2016-10-11 17:51:14

标签: r zoo

使用rollsum中的zoo函数,我看到NAs代替了我期望的有效值。使用rollapply的{​​{1}}按预期工作,但sum不会:

rollsum
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 中的错误?

2 个答案:

答案 0 :(得分:1)

rollmean和rollsum的默认方法不处理包含NA的输入。在这种情况下,请改用rollapply。

答案 1 :(得分: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