rollapply na.rm = TRUE,给出0值而不是NA值

cuxqih21  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(92)

我有一个简单的问题,我似乎无法找到答案在谷歌,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

在此先谢谢您!

7lrncoxx

7lrncoxx1#

以下是两种方法:

**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)**或者,使用您的代码,然后通过将所有NA的位置替换为NA来修复它:

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
sauutmhj

sauutmhj2#

你可以做以下的事情(尽管不是很好)

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

因此,只要z为na,就可以指定NA,且rollapply生成NA
它给你:

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

相关问题