0

我在数据库中有如下数据:

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 问题有关

4

1 回答 1

1

您可以使用外部联接来执行此操作。

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。

以上假设您的现有数据在最终输出中包含您想要的所有日期(但分布在不同的 ID 值上),因此list_of_dates可以从您的初始数据集构建。

如果您希望在最终数据中出现的初始数据中没有出现任何 ID 的日期,那么您将需要以list_of_dates其他方式构建。在这种情况下,即使complete()是本身也不够。

编辑,使每个 ID 都有自己的开始和结束

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"))
于 2020-01-15T00:35:13.940 回答