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