我完全是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