rollapply na.rm = TRUE 给出 0 值而不是 NA
rollapply na.rm = TRUE giving 0 values instead of NA's
我有一个简单的问题,我似乎无法在 google、Whosebug 或 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
提前致谢!
您可以执行以下操作(尽管不是很好)
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
这里有两种方法:
1)注意不是rollapply
给出0而是sum(x, na.rm = TRUE)
给出0。函数sum(x, na.rm = TRUE)
是并不是这里真正需要的。
相反,提供一个以所需方式工作的 sum
版本,即它 returns NA
当输入完全是 NA
值和 returns 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
我有一个简单的问题,我似乎无法在 google、Whosebug 或 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
提前致谢!
您可以执行以下操作(尽管不是很好)
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
这里有两种方法:
1)注意不是rollapply
给出0而是sum(x, na.rm = TRUE)
给出0。函数sum(x, na.rm = TRUE)
是并不是这里真正需要的。
相反,提供一个以所需方式工作的 sum
版本,即它 returns NA
当输入完全是 NA
值和 returns 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