问题描述
我有一个数据框,其中每一行都是不同的日期,每一列都是不同的时间序列。
表中的日期范围为 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 外,您要向下填充。 tidyr
的 fill
的问题在于它一直向下。
这不是一个完整的解决方案,但对于这些数据:
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)