r-填充存储在同一数据库中的多个时间序列中缺少的日期



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

所以我有一个Postgres数据库,里面有时间序列,列是ID、DATE和VALUE(温度(。每个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"))

忽略连接线中的错误。

提前谢谢。

第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

使用您提供的数据,这是可行的。我不知道为什么这能工作,而你的整个代码却不能,但可能在你的代码中,数据结构不是所需要的。如果是这样的话,像out <- tibble::as_tibble(out)这样的东西可能会起作用。我的另一个猜测是complete不是从你需要的包中提取的。使用tidyr::complete对样本进行处理。


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

最新更新