Заполните пропущенные значения в dbplyr - PullRequest
0 голосов
/ 15 января 2020

У меня есть данные в базе данных, которые выглядят следующим образом:

ID    month_year   value
1     01/06/2014   10
1     01/07/2014   100
1     01/10/2014   25

Я хотел бы заполнить пропущенные месяцы:

ID    month_year   value
1     01/06/2014   10
1     01/07/2014   100
1     01/08/2014   NA
1     01/09/2014   NA
1     01/10/2014   25

Я использую пакет BigQuery для использования dbplyr , Я знаю, что это возможно в BigQuery с UNNEST (GENERATE_DATE_ARRAY (... но я не могу заставить это работать с dbplyr. Возможно, связано с этой проблемой github

1 Ответ

1 голос
/ 15 января 2020

Вы можете сделать это с помощью внешнего соединения.

list_of_dates = data_with_missing_dates %>%
  select(month_year) %>%
  distinct()

data_with_filled_dates = data_with_missing_dates %>%
  right_join(list_of_dates, by = "month_year")

Это все стандартные команды dplyr, поэтому dbplyr может перевести их в bigquery.

Выше предполагается, что ваши существующие данные включают в себя все даты, которые вы хотите в конечном выводе (но распределенные по различным значениям идентификатора), следовательно, list_of_dates может быть построено из вашего начального набора данных.

Если есть даты, которые не появляются ни для каких Идентификатор в ваших исходных данных, которые вы хотите отобразить в ваших окончательных данных, тогда вам нужно будет построить list_of_dates другим способом. В этом случае даже complete() само по себе будет недостаточно.

Редактировать, чтобы у каждого идентификатора были свои начало и конец

list_of_dates = data_with_missing_dates %>%
  select(month_year) %>%
  distinct() %>%
  mutate(placeholder = 1)

date_limits = data_with_missing_dates %>%
  group_by(ID) %>%
  summarise(min_date = min(month_year),
            max_date = max(month_year)) %>%
  mutate(placeholder = 1)

data_with_filled_dates = date_limits %>%
  outer_join(list_of_dates, by = "placeholder") %>%
  filter(min_date <= month_year,
         max_date >= month_year) %>%
  select(ID, month_year) %>%
  left_join(data_with_missing_dates, by = c("ID", "month_year"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...