如何根据R中的上一个日期和下一个日期填写缺失数据?

如何根据R中的上一个日期和下一个日期填写缺失数据?,r,datetime,R,Datetime,关于此主题,还有两个问题: 以图1为例,我们可以看到10/12/2016 12:07中的数据缺失。我想使用上一行和下一行数据(即10/10/2016 10:50 5.73;10/24/2016 08:53 6.09)对缺失的数据进行线性插值(不是“5.73”和“6.09”的平均值,而是 根据“日期”)。示例数据文件附在下面: 09/26/2016 11:57 5.42 10/10/2016 10:50 5.73 10/12/2016 12:07 10/24/2016 08:

关于此主题,还有两个问题:

以图1为例,我们可以看到10/12/2016 12:07中的数据缺失。我想使用上一行和下一行数据(即10/10/2016 10:50 5.73;10/24/2016 08:53 6.09)对缺失的数据进行线性插值(不是“5.73”和“6.09”的平均值,而是 根据“日期”)。示例数据文件附在下面:

09/26/2016 11:57    5.42
10/10/2016 10:50    5.73
10/12/2016 12:07    
10/24/2016 08:53    6.09
11/07/2016 11:25    6.43
11/21/2016 13:57    6.33
12/05/2016 14:01    7.97
12/19/2016 13:00    8.47
如图2所示,我们可以使用“Trend()”来实现这一目标

=TREND(M22:M23,L22:L23,O22)
我想知道R中是否也有一个有用的函数

示例数据:

df <- data.frame(date = mdy_hm(
                    c("10/10/2016 10:50",
                      "10/12/2016 12:07",
                      "10/24/2016 08:53")),
            figure = c(5.73, NA_real_, 6.09))
使用
lubridate
dplyr

library(dplyr)
library(lubridate)

df %>% 
   mutate(figure = ifelse(is.na(figure),
                      lag(figure, 1) + (lead(figure, 1) - lag(figure, 1)) *
                      as.numeric(difftime(date, lag(date, 1))) / 
                      as.numeric((difftime(lead(date, 1), date) + difftime(date, lag(date, 1)))),
                      figure)) %>% 
   mutate(figure = round(figure, 2))

请发布数据没有图片!查看
?dput
。您可以进行加权平均,因此,如果上一个日期更接近缺失的日期,它的加权值会更高。请查看
difftime
。然后你可以得到两个时差:“之前和错过”和“错过和之后”。您可以通过“*diff1/(diff1+diff2)之后的“+”值之前的值”插值。很抱歉,我没有发布数据。我已经上传了。@Vaettchen谢谢@西恩德鲁斯。然而,我恐怕你的方程式应该是:“先值后值”+“后值后值”*diff1/(diff1+diff2)欣赏它。我尝试了你的代码,结果是“2016-10-12 12:07:00”的“13.92”。然而,我认为这个值可能是错误的。因为我想填写的内容就像西恩德鲁斯在评论中说的那样。所以结果应该是“5.78”。你可以看到我编辑的问题,我已经用Excel中的一个示例对其进行了更改。在你的评论后进行了更新。我想知道你是否可以在有时间时看到问题()。这个额外的问题是整个“数据缺失”问题的另一个50%。
library(dplyr)
library(lubridate)

df %>% 
   mutate(figure = ifelse(is.na(figure),
                      lag(figure, 1) + (lead(figure, 1) - lag(figure, 1)) *
                      as.numeric(difftime(date, lag(date, 1))) / 
                      as.numeric((difftime(lead(date, 1), date) + difftime(date, lag(date, 1)))),
                      figure)) %>% 
   mutate(figure = round(figure, 2))