【问题标题】:rollapply na.rm = TRUE giving 0 values instead of NA'srollapply na.rm = TRUE 给出 0 值而不是 NA
【发布时间】:2017-01-28 22:39:21
【问题描述】:

我有一个简单的问题,我似乎无法在 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 

提前谢谢你!

【问题讨论】:

    标签: r na rollapply na.rm


    【解决方案1】:

    这里有两种方法:

    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 
    

    【讨论】:

      【解决方案2】:

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

      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 
      

      【讨论】:

      • roll_sumr 仍然给我与rollapply 相同的结果。我将您的代码修改为roll_sumr(z, 3, na.rm = TRUE),但仍然给了我与以前相似的结果。我正在寻找的输出在主要问题中说明。
      • “不是很好”,但是它完成了工作。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2016-04-15
      • 2017-08-03
      • 1970-01-01
      • 2019-01-01
      • 2019-09-07
      • 2016-07-24
      相关资源
      最近更新 更多