如何按类别对多地点时间序列的连续日期进行分组?
解决方案
问题分析
你需要按地点(location)、分类(category)以及连续日期段分组汇总,原代码存在三个核心问题:
- 未将
location和category纳入分组依据,会导致不同地点/分类的连续日期被错误合并 mutate中使用==是逻辑判断而非赋值,属于语法错误- 日期差计算总天数时未考虑“天数差+1”的逻辑(比如两天连续的日期差是1,但总天数是2)
正确代码
先确保Date列为日期格式(如果原始数据不是的话),再用dplyr完成分组汇总:
# 转换Date列为日期格式(若原始数据为字符型则执行) df$Date <- as.Date(df$Date) # 生成目标数据框 new_df <- df %>% # 第一步:按地点和分类分组,在组内标记连续日期块 group_by(location, category) %>% mutate( # 标记连续日期分组:首行设为TRUE,后续行若与上一行日期差≠1则新建分组 date_grp = cumsum(c(TRUE, diff(Date) != 1)) ) %>% # 第二步:按地点、分类、连续日期块分组,汇总计算 group_by(location, category, date_grp) %>% summarise( start_date = min(Date), end_date = max(Date), total_days = as.integer(end_date - start_date) + 1 ) %>% # 移除临时分组列,调整列顺序 ungroup() %>% select(location, start_date, end_date, total_days, category)
运行结果
执行后得到的new_df与你期望的结果完全一致:
| location | start_date | end_date | total_days | category |
|---|---|---|---|---|
| site1 | 2007-11-03 | 2007-11-04 | 2 | cat1 |
| site1 | 2007-11-05 | 2007-11-05 | 1 | cat3 |
| site1 | 2007-11-06 | 2007-11-07 | 2 | cat2 |
| site2 | 2007-11-06 | 2007-11-07 | 2 | cat2 |
内容的提问来源于stack exchange,提问作者BentBindle
相关产品推荐
相关产品推荐

