如何在R语言中按不规则时间间隔分组汇总数据?
按不规则时间间隔分组汇总数据的实现方案
当然可以实现!用R处理不规则时间间隔的分组汇总完全没问题,核心思路是先给每个日期分配对应的「间隔组标签」,再按这个标签分组计算就行。下面结合你提到的几种场景(11天、3个月、2年)给出具体代码示例:
1. 按11天间隔分组
我们可以先把日期转换成数值型(从起始日期算起的天数),再用取整函数按11天为单位划分组:
library(dplyr) library(lubridate) # 复用你提供的数据集 date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"), by="day") property_damages_in_dollars <- rnorm(731, 100, 10) final_data <- data.frame(date_decision_made, property_damages_in_dollars) # 11天间隔分组逻辑 final_data %>% mutate( date = as.Date(date_decision_made), # 计算从起始日开始的天数,按11天取整生成组标签 interval_11d = floor((date - min(date)) / 11) ) %>% group_by(interval_11d) %>% summarise( # 补充每组起止日期,让结果更直观 start_date = min(date), end_date = max(date), total_damage = sum(property_damages_in_dollars, na.rm = TRUE), obs_count = n() )
2. 按3个月间隔分组
这里可以借助lubridate的日期处理函数,通过计算月份差来分组,也可以直接用季度(刚好是3个月)来简化操作:
# 方式一:通过月份差手动计算3个月组 final_data %>% mutate( date = as.Date(date_decision_made), # 将年份+月份转换成连续数值,再按3个月取整 interval_3m = floor((year(date)*12 + month(date) - (year(min(date))*12 + month(min(date)))) / 3) ) %>% group_by(interval_3m) %>% summarise( start_date = min(date), end_date = max(date), total_damage = sum(property_damages_in_dollars, na.rm = TRUE), obs_count = n() ) # 方式二:用floor_date直接按季度分组(更简洁) final_data %>% mutate( date = as.Date(date_decision_made), interval_3m = floor_date(date, unit = "quarter") ) %>% group_by(interval_3m) %>% summarise( total_damage = sum(property_damages_in_dollars, na.rm = TRUE), obs_count = n() )
3. 按2年间隔分组
和3个月的思路类似,通过计算年份差来划分2年一组的区间:
final_data %>% mutate( date = as.Date(date_decision_made), # 计算从起始年份开始的2年组标签 interval_2y = floor((year(date) - year(min(date))) / 2) ) %>% group_by(interval_2y) %>% summarise( start_date = min(date), end_date = max(date), total_damage = sum(property_damages_in_dollars, na.rm = TRUE), obs_count = n() )
通用思路总结
不管是哪种不规则间隔,核心步骤都是:
- 把日期转换成可计算的连续数值(天数、月份数、年份数)
- 用
floor()对数值按间隔大小取整,生成唯一的组标签 - 按组标签分组后进行汇总计算
这样就能灵活处理任意时间间隔的分组需求啦!
内容的提问来源于stack exchange,提问作者user14644617
相关产品推荐
相关产品推荐

