R diff() 处理 NA

R diff() handling NA

如果缺少当前值或滞后值,我想计算变量的一阶差分。如果缺少任何一个值,则 R diff() 函数 returns 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)

您可以将 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 并将 window 设置为 2:

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

这里有一个方法:

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 放回到计算的差异中。