floor_date后添加缺失数据/​​检测并填补缺失数据缺口

Addition of missing data after floor_date / detect and fill in missing data gaps

我想每个月总结一组更大的数据。 floor_date 提供了正确的功能来汇总每月各个日期的数据。但不幸的是,我需要确保所有月份都包含在最后的 table 中。因此,初始数据并不总是涵盖所有月份,但在 floor_date 之后,相应的月份必须为 0;行/月不能简单地丢失。我怎样才能自动确保这一点?

以下示例代码阐明了我的问题:

df <- data.frame(
  time =  c(as.Date("01-01-2020", format = "%d-%m-%Y"), as.Date("02-01-2020", format = "%d-%m-%Y"), as.Date("01-03-2020", format = "%d-%m-%Y")),
  text = c("A", "A", "B")
  )


df2 <- df %>%
  mutate(month = floor_date(time, unit = "month")) %>%
  select(text, month) %>%
  group_by(month, text) %>%
  summarise(n = n())

df2

# A tibble: 2 x 3
# Groups:   month [2]
  month      text      n
  <date>     <fct> <int>
1 2020-01-01 A         2
2 2020-03-01 B         1

应该认识到,2020-01 月 B 没有数据,2020-02 月 A 和 B 没有数据,2020-03 月 A 也没有数据:这些行应该添加值 0 .

不幸的是,到目前为止我还没有找到以自动化方式解决问题的解决方案。

提前致谢!

我无法理解在给定月份 (floor_date) 改变变量时使用 format 的必要性。此格式将变量转换为字符类型,因此无法执行进一步的计算。

删除该步骤,然后使用 tidyr::complete 您可以填写缺少的月份,如下所示-

df <- data.frame(
  time =  c(as.Date("01-01-2020", format = "%d-%m-%Y"), as.Date("02-01-2020", format = "%d-%m-%Y"), as.Date("01-03-2020", format = "%d-%m-%Y")),
  text = c("A", "A", "B")
)

library(lubridate, warn.conflicts = F)
library(tidyverse, warn.conflicts = F)

df %>%
  mutate(month = floor_date(time, unit = "month")) %>%
  group_by(text, month) %>%
  summarise(n = n(), .groups = 'drop') %>%
  complete(nesting(text), month = seq.Date(from = min(month), to = max(month), by = '1 month'), fill = list(n = 0))

# A tibble: 6 x 3
  text  month          n
  <chr> <date>     <dbl>
1 A     2020-01-01     2
2 A     2020-02-01     0
3 A     2020-03-01     0
4 B     2020-01-01     0
5 B     2020-02-01     0
6 B     2020-03-01     1

reprex package (v2.0.0)

于 2021-07-06 创建

Base R 选项使用 cut -

stack(table(cut(df$time,'month')))[2:1]

#         ind values
#1 2020-01-01      2
#2 2020-02-01      0
#3 2020-03-01      1