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

R 在同一数据库中存储的多个时间序列中填写缺失的日期,r,tidyverse,R,Tidyverse,我是一个完全的R初学者,我只需要快速清理一下我的数据。但我遇到了一个我无法解决的问题 所以我有一个带有时间序列的Postgres db,列是ID、日期和值(温度)。每个ID都是一个新的测量站,因此每个ID都有一个时间序列(大约2000个唯一ID,4米行)。日期跨度为1915年至2016年,有些序列重叠,有些则不重叠。如果一周中缺少测量值,我希望用NA值(我在后面插值)填充这些周 我遇到的问题是,complete(Date.seq)在1915年到2016年之间的所有周创建NA值,我清楚地理解为什么

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

所以我有一个带有时间序列的Postgres db,列是ID、日期和值(温度)。每个ID都是一个新的测量站,因此每个ID都有一个时间序列(大约2000个唯一ID,4米行)。日期跨度为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"))
预期产出

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

使用您提供的数据,这是可行的。我不知道为什么这样做有效,而您的整个代码却没有,但在您的代码中,数据结构可能不是所需要的。如果是这样,使用您提供的数据执行类似于
out的操作,这是可行的。我不知道为什么这样做有效,而您的整个代码却没有,但在您的代码中,数据结构可能不是所需要的。如果是这样的话,
out试图复制上面的内容,但我得到了错误:
PostgreSQL()中的错误:找不到函数“PostgreSQL”
我有
library(DBI)
library(lubridate)
欢迎使用StackOverflow!你能举个例子来帮助你吗?(为示例输入提供
dput()
、预期输出和可复制粘贴并按原样运行的代码)我想问题是如何使
tidyr::complete
函数,正如@Aurèle所建议的,一些示例数据就足够了,谢谢您的快速响应!我添加了一些样本数据(不是原始数据,只是随机化)@Aurèle希望样本数据的格式是正确的。代码中唯一缺少的是库,我添加了它们。@markhogue我认为您缺少库RPostgreSQL。试图复制上面的内容,但我得到了错误:
PostgreSQL()中的错误:找不到函数“PostgreSQL”
我有
库(DBI)
库(lubridate)
欢迎来到StackOverflow!你能举个例子来帮助你吗?(为示例输入提供
dput()
、预期输出和可复制粘贴并按原样运行的代码)我想问题是如何使
tidyr::complete
函数,正如@Aurèle所建议的,一些示例数据就足够了,谢谢您的快速响应!我添加了一些样本数据(不是原始数据,只是随机化)@Aurèle希望样本数据的格式是正确的。代码中唯一缺少的是库,我添加了它们。@markhogue我想你缺少库RPostgreSQL。谢谢你的时间和耐心。通过运行此命令,问题仍然存在。我不希望收到的日期中NA值超出每个ID的结束日期和开始日期。例如,在我这里的示例数据中,对于ID 1:我只希望在2015-10-01和2015-10-29之间填充缺少的日期,我不希望在开始日期和结束日期之外有其他NA值。我需要为每个id提供某种动态的最小值和最大值。@Jbt New-edited-answer希望能够回应您的评论。如果没有,我们可以继续:-)谢谢你的时间和耐心。通过运行此命令,问题仍然存在。我不希望收到的日期中NA值超出每个ID的结束日期和开始日期。例如,在我这里的示例数据中,对于ID 1:我只希望在2015-10-01和2015-10-29之间填充缺少的日期,我不希望在开始日期和结束日期之外有其他NA值。我需要为每个id提供某种动态的最小值和最大值。@Jbt New-edited-answer希望能够回应您的评论。如果没有,我们可以继续:-)
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

library(lubridate)
library(dplyr)
library(tidyr)

a <- "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"

df <- read.table(text = a, header = TRUE)

big_df1 <- df %>% 
  filter(ID == 1)%>% 
  mutate(DATE = as.Date(DATE)) %>% 
  tidyr::complete(DATE = seq(ymd(min(DATE)), ymd(max(DATE)), by= "week"))

big_df2 <- df %>% 
  filter(ID == 2)%>% 
  mutate(DATE = as.Date(DATE)) %>% 
  tidyr::complete(DATE = seq(ymd(min(DATE)), ymd(max(DATE)), by= "week"))

big_df3 <- df %>% 
  filter(ID == 3)%>% 
  mutate(DATE = as.Date(DATE)) %>% 
  tidyr::complete(DATE = seq(ymd(min(DATE)), ymd(max(DATE)), by= "week"))

big_df <- rbind(big_df1, big_df2, big_df3)
big_df

   DATE          ID VALUE
   <date>     <int> <int>
 1 2015-10-01     1     1
 2 2015-10-08     1     1
 3 2015-10-15     1     1
 4 2015-10-22    NA    NA
 5 2015-10-29     1     1
 6 1956-01-01     2     1
 7 1956-01-08    NA    NA
 8 1956-01-15     2     1
 9 1956-01-22     2     1
10 1982-01-01     3     1
11 1982-01-08    NA    NA
12 1982-01-15     3     1
13 1982-01-22     3     1
14 1982-01-29     3     1