3

我有一个带有前导 NA 的日期向量,我想使用na.approxfrom package为这些 NA 生成一个近似序列zoo

na.approx不适用于领先的 NA:

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"

我以为我可以使用反向向量,rev但我仍然得到 NA

as.Date(na.approx(rev(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" NA           NA           NA   

有任何想法吗?

4

2 回答 2

2

找到了我的答案。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"
于 2017-03-25T15:47:33.540 回答
2

na.approx需要为向量的orrule值之外的值传递a 。如果使用,则缺失值将使用最接近的值进行估算。minmaxrule=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
于 2017-03-25T16:04:08.697 回答