【问题标题】:R diff() handling NAR diff() 处理不适用
【发布时间】:2018-07-03 04:58:44
【问题描述】:

如果缺少当前值或滞后值,我想计算变量的一阶差。如果缺少任何一个值,R diff() 函数将返回 NA。这种行为可以改变吗?

data <- c(5, NA, NA, 10, 25)

diff_i_want <- c(-5, NA, 10, 15)

diff_i_get <- diff(data)

identical(diff_i_want, diff_i_get)

【问题讨论】:

  • 导致 10 出现在您想要的输出中的逻辑是什么?
  • 逻辑是 (10 - NA) = 10。

标签: r na difference


【解决方案1】:

你可以用零替换NA

x <- c(5, NA, NA, 10, 25)
> diff("[<-"(x, is.na(x), 0))
[1] -5  0 10 15

诚然,这与您的diff_i_want 不同...但我不确定您的逻辑。您如何将-5 作为您答案的第一个元素?为什么-5?到达那里的唯一方法是将NA 隐式替换为零。所以如果你在那里做这个替换,你为什么不替换下一个元素呢?

虽然您想要的答案对我来说没有多大意义,但有可能获得它,例如使用zoo::rollapply:

# first define a function that takes a vector of length 2
# ... and will output the difference if no more than 1 of the values is missing
weirddiff <- function(x) {
  if(any(is.na(x)) && !all(is.na(x))) x[is.na(x)] <- 0
  x[2] - x[1]
}

现在我们可以使用rollapply,窗口设置为2

library(zoo)
rollapply(x,2,weirddiff)
[1] -5 NA 10 15

【讨论】:

    【解决方案2】:

    这是一种方法:

    data <- c(5, NA, NA, 10, 25)
    data2 = data
    data2[is.na(data2)] = 0
    diffData2 = diff(data2)
    diffData2[diff(is.na(data))==0 & is.na(data[-1])] = NA
    
    > diffData2
    [1] -5 NA 10 15
    

    首先将数据复制到data2,将所有NA设置为0,然后进行diff。 在最后一步将所有 NA 放回计算的 diff 中。

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多