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
我想每个月总结一组更大的数据。 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