Заполните пропущенные даты в нескольких временных рядах, хранящихся в одной базе данных - PullRequest
1 голос
/ 07 апреля 2020

Я - полный новичок в R, и мне просто нужно быстро очистить мои данные. Но я столкнулся с проблемой, которую не могу обернуть.

Так что у меня есть Postgres дБ с сериями времени, столбцы ID, DATE и VALUE (температура). Каждый идентификатор - это новая измерительная станция, поэтому у меня есть время ser ie для каждого идентификатора (около 2000 уникальных идентификаторов, 4 миллиона строк). Даты охватывают период 1915-2016 гг., Некоторые серии частично совпадают, а некоторые нет. Если в течение недели отсутствуют измерения, я хочу заполнить эти недели значением NA (которое я интерполирую после).

Проблема, с которой я сталкиваюсь, заключается в том, что complete(Date.seq) создает значения NA для всех недель между 1915 и 2016, я четко понимаю, почему это происходит. Как я могу сделать так, чтобы он заполнял только значения между фактической датой начала и окончания указанного времени c timeser ie? Я хочу, чтобы скользящие минимальные и максимальные значения зависели от начальной и конечной даты каждого указанного идентификатора c, а затем заполняли отсутствующие даты между начальной и конечной датой каждого идентификатора.

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

Игнорировать ошибки в соединительной линии.

Заранее спасибо.

Edit1 Пример данных

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

1 Ответ

0 голосов
/ 07 апреля 2020

Используя предоставленные вами данные, это работает. Я не знаю, почему это работает, а весь ваш код - нет, но, возможно, в вашем коде структура данных - это не то, что нужно. Если это так, что-то вроде 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...