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 放回到计算的差异中。
如果缺少当前值或滞后值,我想计算变量的一阶差分。如果缺少任何一个值,则 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 放回到计算的差异中。