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