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