R语言按周/月分组统计观测数与求和的问题求助
问题分析与解决办法
我来帮你梳理下原代码里的问题,再给出更简洁靠谱的dplyr解法~
首先说说你之前代码的问题:
- 用
aggregate得到的y.week和y.mon是普通数据框,它们的行名是格式化后的周/月字符串,不是xts对象的日期索引,所以index(y.week)这种写法是无效的; - 直接把
counts_week整个数据框赋值给y.week$count也会出错,因为y.week$count需要的是数值向量,不是完整的数据框。
你习惯用dplyr做分组统计是非常好的选择,它能让分组计算的逻辑更直观,下面是优化后的完整方案:
第一步:统一生成基础数据
先把数据生成代码只写一次,避免重复冗余:
library(dplyr) # 创建基础数据集 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)
按周统计(求和+观测计数)
核心是先确保日期列是Date类型,再生成周分组标识,最后用summarise()一次性计算总和与观测数:
weekly_stats <- final_data %>% # 确保日期是Date类型(这里原数据已经是,但统一处理更稳妥) mutate(date_decision_made = as.Date(date_decision_made)) %>% # 按「年的周数-两位年份」分组,%W是周一为周起始,若要周日起始用%U group_by(week = format(date_decision_made, "%W-%y")) %>% summarise( total_damages = sum(property_damages_in_dollars, na.rm = TRUE), count = n() # n()直接统计每组的观测数量 )
按月统计(求和+观测计数)
逻辑和按周完全一致,只是分组标识换成「年-月」格式:
monthly_stats <- final_data %>% mutate(date_decision_made = as.Date(date_decision_made)) %>% group_by(month = format(date_decision_made, "%Y-%m")) %>% summarise( total_damages = sum(property_damages_in_dollars, na.rm = TRUE), count = n() )
这样处理后,weekly_stats和monthly_stats都会清晰包含分组标识、总损失金额、对应周期的观测数三列,代码简洁且逻辑一目了然。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

