使用前一天的数据完成时间序列中的缺失值 - 使用 R
Complete missing values in time series using previous day data - using R
我有一个数据框,其中每一行都是不同的日期,每一列都是不同的时间序列。
table 中的日期范围是 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
的问题是它一直向下。
这不是一个完整的 tidyverse 解决方案,但对于此数据:
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, NA,
as.Date("2019-03-01"), 10, NA,
as.Date("2019-04-01"), 20, 6,
as.Date("2019-05-01"), 30, NA,
as.Date("2019-06-01"), NA, 8,
as.Date("2019-07-01"), 7, NA,
as.Date("2019-08-01"), 5, NA,
as.Date("2019-09-01"), NA, NA,
as.Date("2019-10-01"), NA, 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)
我有一个数据框,其中每一行都是不同的日期,每一列都是不同的时间序列。
table 中的日期范围是 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
的问题是它一直向下。
这不是一个完整的 tidyverse 解决方案,但对于此数据:
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, NA,
as.Date("2019-03-01"), 10, NA,
as.Date("2019-04-01"), 20, 6,
as.Date("2019-05-01"), 30, NA,
as.Date("2019-06-01"), NA, 8,
as.Date("2019-07-01"), 7, NA,
as.Date("2019-08-01"), 5, NA,
as.Date("2019-09-01"), NA, NA,
as.Date("2019-10-01"), NA, 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)