反向/反向na.approx

时间:2017-03-25 15:10:36

标签: r na zoo na.approx

我有一个带有领先NA的日期向量,我想使用来自包na.approx的{​​{1}}为这些NA生成近似序列。

zoo不适用于领导NAs:

na.approx

我认为我可以使用x <- as.Date(c(rep(NA,3),"1992-01-16","1992-04-16","1992-07-16", "1992-10-16","1993-01-15","1993-04-16","1993-07-17")) as.Date(na.approx(x,na.rm=FALSE)) [1] NA NA NA "1992-01-16" "1992-04-16" 1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17" 来反转我的矢量,但我仍然可以使用NAs

rev

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

na.approx要求为rulemin值以外的值传递max 你的矢量。如果使用rule=2,则使用最接近的值估算缺失值。

as.Date(na.approx(x,na.rm=FALSE, rule=2))
# [1] "1992-01-16" "1992-01-16" "1992-01-16" "1992-01-16" "1992-04-16" "1992-07-16" "1992-10-16" "1993-01-15"
#  [9] "1993-04-16" "1993-07-17"

作为替代方案,您可以使用na.spline(如您的答案)。你提到它可能会有点疯狂 因此,您可以编写一个函数,根据度量之间的时间差来估算值。 我在这里使用了第一个非缺失的区别

add_leading_seq_dates <- function(x) {
        first_non_missing = which.min(is.na(x))
        first_day_diff = na.omit(diff(x))[1]
        no_of_leadng_missing = first_non_missing - 1
        input_dates = x[first_non_missing] - cumsum(rep(first_day_diff, no_of_leadng_missing)) 
        x[is.na(x)] = rev(input_dates)
        x
}

add_leading_seq_dates(x)

# [1] "1991-04-18" "1991-07-18" "1991-10-17" "1992-01-16" "1992-04-16"
# [6] "1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17"

diff(add_leading_seq_dates(x))
# Time differences in days
# [1] 91 91 91 91 91 92 91 91 92

答案 1 :(得分:1)

找到我的答案。 na.spline可以很好地处理大量数据。在上面的例子中,我有几个日期导致近似漂移。然而,在我的现实生活中,没有任何漂移。

as.Date(na.spline(x,na.rm=FALSE))
 [1] "1993-07-17" "1993-04-16" "1993-01-15" "1992-10-16" "1992-07-16" 
"1992-04-16" "1992-01-16" "1991-10-15" "1991-07-13" "1991-04-06"