微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用前一天的数据完成时间序列中的缺失值 - 使用 R

如何解决使用前一天的数据完成时间序列中的缺失值 - 使用 R

我有一个数据框,其中每一行都是不同的日期,每一列都是不同的时间序列。
表中的日期范围为 01.01.2019-01.01.2021。
一些时间序列仅与部分日期相关,并且在周末和节假日缺少值。

我如何仅使用前一天的每列相关日期的值来完成每个时间序列的缺失值(如果特定列中的时间序列是从 01.03.2019 到 01.09.2019 我只想完成此日期范围内的缺失值)?

我曾尝试使用填充功能

data <- data %>%  
fill(colnames(data)) 

但它也会在特定时间序列结束后补全缺失的数据。

例如,df是:

#  Date         time_series_1           time_series_2
1  01-01-2019               NA                      10
2  02-01-2019               5                       NA 
3  03-01-2019               10                      NA 
4  04-01-2019               20                      6 
5  05-01-2019               30                      NA 
6  06-01-2019               NA                      8 
7  07-01-2019               7                       NA 
8  08-01-2019               5                       NA 
9  09-01-2019               NA                      NA
10 10-01-2019               NA                      NA 

所需的输出是:

#  Date         time_series_1           time_series_2
1  01-01-2019               NA                      10
2  02-01-2019               5                       10 
3  03-01-2019               10                      10 
4  04-01-2019               20                      6 
5  05-01-2019               30                      6 
6  06-01-2019               30                      8 
7  07-01-2019               7                       NA 
8  08-01-2019               5                       NA 
9  09-01-2019               NA                      NA
10 10-01-2019               NA                      NA 

谢谢!

解决方法

如果我理解正确,诀窍是除了最底部的 NA 外,您要向下填充。 tidyrfill 的问题在于它一直向下。

这不是一个完整的解决方案,但对于这些数据:

library(dplyr)
library(tidyr)
data <- tribble(
  ~Date,~time_series_1,~time_series_2,as.Date("2019-01-01"),NA,10,as.Date("2019-02-01"),5,as.Date("2019-03-01"),as.Date("2019-04-01"),20,6,as.Date("2019-05-01"),30,as.Date("2019-06-01"),8,as.Date("2019-07-01"),7,as.Date("2019-08-01"),as.Date("2019-09-01"),as.Date("2019-10-01"),NA
)

您可以分别确定每个时间序列的结束日期:

LastTS1Date <- with( data,max(Date[!is.na(time_series_1)])) 
LastTS2Date <- with( data,max(Date[!is.na(time_series_2)]))

然后使用 baseR 过滤器语法只更改数据帧中截至这些日期的部分:

data[data$Date <= LastTS1Date,] <-
  data[data$Date <= LastTS1Date,] %>% fill(time_series_1)

data[data$Date <= LastTS2Date,] <-
  data[data$Date <= LastTS2Date,] %>% fill(time_series_2)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。