2

我有一个简单的问题,我似乎无法在 google、stackoverflow 或 stackexchange 上找到答案。我目前正在使用示例rollapply来查找包含 NA 的某些值的总和。例如:

 z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA))
 rollapply(z, 3, sum, na.rm = TRUE, align = "right")

这输出:

  3  4  5  6  7  8  9 
  0  0  2  5  9 12  9 

这看起来不错,但是,有两次连续有 3 个 NA。求和功能将 NA 交换为 0。不幸的是,这不适用于我将要使用的数据,因为 0 是一个有意义的值。有没有办法再次用 NA 替换 0?

我正在寻找如下输出:

  3   4   5  6  7  8  9 
  NA  NA  2  5  9 12  9 

先感谢您!

4

2 回答 2

0

这里有两种方法:

1)请注意,这不是rollapply给出 0,而是sum(x, na.rm = TRUE)给出 0。该函数sum(x, na.rm = TRUE)并不是这里真正需要的。

相反,提供一个sum以所需方式工作的版本,即NA当输入完全是NA值时返回,sum(x, na.rm = TRUE)否则返回。

sum_na <- function(x) if (all(is.na(x))) NA else sum(x, na.rm = TRUE)
rollapplyr(z, 3, sum_na)

2)或者,使用您的代码并在之后通过将其输入全部替换为的任何位置来修复NANA

zz <- rollapplyr(z, 3, sum, na.rm = TRUE)
zz[rollapply(is.na(z), 3, all)] <- NA

给予:

> zz
 3  4  5  6  7  8  9 
NA NA  2  5  9 12  9 
于 2016-09-22T11:53:39.240 回答
0

您可以执行以下操作(即使不是很好)

require(zoo)
z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA))
tmp <- rollapply(z, 3, sum, na.rm = TRUE, align = "right")

tmp[is.na(z)[-2:-1] & tmp == 0] <- NA
tmp

NA所以你在哪里分配zna 并且有一个NArollapply

这给了你:

> tmp
 3  4  5  6  7  8  9 
NA NA  2  5  9 12  9 
于 2016-09-21T19:17:07.897 回答