rollsum 产生意外的 NA
rollsum producing unexpected NA
使用 zoo
中的 rollsum
函数,我看到 NA 代替了我期望的有效值。 rollapply
使用 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
我是不是遗漏了什么,或者这是 rollsum
正在使用的优化中的错误?
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
.
rollmean 和 rollsum 的默认方法不处理包含 NA 的输入。在这种情况下,请改用 rollapply。
使用 zoo
中的 rollsum
函数,我看到 NA 代替了我期望的有效值。 rollapply
使用 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
我是不是遗漏了什么,或者这是 rollsum
正在使用的优化中的错误?
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
.
rollmean 和 rollsum 的默认方法不处理包含 NA 的输入。在这种情况下,请改用 rollapply。