填写存储在同一数据库中的多个时间序列中的缺失日期

时间:2020-04-07 14:01:58

标签: r tidyverse

我是R的完全入门者,我只需要快速清理一下数据即可。但是我遇到了一个问题,我无法解决问题。

所以我有一个带有时间序列的Postgres数据库,列是ID,DATE和VALUE(温度)。每个ID都是一个新的测量站,因此每个ID都有一个时间序列(大约2000个唯一ID,400万行)。日期跨度为1915年至2016年,有些系列重叠,有些则没有。如果某周缺少测量值,我想用NA值填充这些周(我在之后插值)。

我遇到的问题是complete(Date.seq)会为1915年至2016年之间的所有星期创建NA值,我清楚地知道为什么会发生这种情况。如何使它仅填充特定时间段的实际开始日期和结束日期之间的值?我想要一个移动的最小值和最大值,这取决于每个特定ID的开始日期和结束日期,而不是填充每个ID的开始日期和结束日期之间的缺失日期。

library("RpostgreSQL")
library("tidyverse")
library("lubridate")

con <- dbConnect(PostgreSQL(), user = "postgres", 
    dbname="", password = "", host = "localhost", port= "5432")

    out <- dbGetQuery(con, "SELECT * FROM *******.Weekly_series")

    out %>% 
        group_by(ID)%>% 
        mutate(DATE = as.Date(DATE)) %>% 
        complete(DATE = seq(ymd("1915-04-14"), ymd("2016-03-30"), by= "week"))

忽略连接线路中的错误。

谢谢。

编辑1 样本数据

ID  DATE     VALUE
1   2015-10-01  1
1   2015-10-08  1
1   2015-10-15  1
1   2015-10-29  1
2   1956-01-01  1
2   1956-01-15  1
2   1956-01-22  1
3   1982-01-01  1
3   1982-01-15  1
3   1982-01-22  1
3   1982-01-29  1

期望的输出

ID  DATE     VALUE
1   2015-10-01  1
1   2015-10-08  1
1   2015-10-15  1
1   2015-10-22  NA
1   2015-10-29  1
2   1956-01-01  1
2   1956-01-08  NA
2   1956-01-15  1
2   1956-01-22  1
3   1982-01-01  1
3   1982-01-08  NA
3   1982-01-15  1
3   1982-01-22  1
3   1982-01-29  1

1 个答案:

答案 0 :(得分:0)

使用您提供的数据,此方法有效。我不知道为什么这行得通,而您的整个代码却行不通,但是可能在您的代码中,并不需要数据结构。如果是这样,类似<input>的方法可能会起作用。我的另一个猜测是out <- tibble::as_tibble(out)不是从您需要的软件包中提取的。在样本上使用complete

tidyr::complete