R diff()处理不适用

时间:2018-07-02 20:12:29

标签: r na difference

如果当前值或滞后值缺失,我想计算变量的第一个差。如果缺少任何一个值,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)

2 个答案:

答案 0 :(得分:2)

您可以将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

答案 1 :(得分:1)

这是一种方法:

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,然后进行比较。 最后一步,将所有NA放回计算得出的差异中。