多列日数据按月差异化聚合后合并为月度DataFrame的技术问询
问题:多列日数据按月聚合并合并为完整月度DataFrame
数据样式
| Date | Lahontan.Hydrologic Inflowcfs | Lahontan.Pool Elevationft | Lahontan.Surface Areaacre | Lahontan.Storageacre-ft | CarsonAtFtChurchill.Gage Inflowcfs |
|---|---|---|---|---|---|
| 1966-10-02 | 86.7 | 4123. | 2903. | 56300 | 0.1 |
| 1966-10-03 | 34.0 | 4123. | 2876. | 55510 | 0 |
| 1966-10-04 | -72.8 | 4123. | 2844. | 54570 | 0 |
| ... | ... | ... | ... | ... | ... |
现有单列聚合代码
avgHI <- ddply(mdf, "month", summarise, `Lahontan.Hydrologic Inflowcfs` = mean(`Lahontan.Hydrologic Inflowcfs`)) totalCRInflow <- ddply(mdf, "month", summarise, `CarsonAtFtChurchill.Gage Inflowcfs` = sum(`CarsonAtFtChurchill.Gage Inflowcfs`)) # etc....
解决方案
你之前的做法会丢失年份信息(仅按1-12月分组),且多次聚合后合并容易出错。推荐用以下步骤一次性完成聚合并生成完整时间序列的DataFrame:
1. 处理日期并按年月分组聚合
先将日期列转为标准日期格式,提取年月组合作为分组键,然后对每列应用对应的聚合规则:
library(dplyr) library(lubridate) # 转换日期格式,生成年月分组键 mdf <- mdf %>% mutate(Date = ymd(Date), year_month = floor_date(Date, "month")) # 把日期统一到当月第一天,作为时间索引 # 一次性完成多列不同规则的月度聚合 monthly_agg <- mdf %>% group_by(year_month) %>% summarise( # 按你的需求替换各列的聚合函数 `Lahontan.Hydrologic Inflowcfs` = mean(`Lahontan.Hydrologic Inflowcfs`, na.rm = TRUE), `Lahontan.Pool Elevationft` = mean(`Lahontan.Pool Elevationft`, na.rm = TRUE), `Lahontan.Surface Areaacre` = max(`Lahontan.Surface Areaacre`, na.rm = TRUE), `Lahontan.Storageacre-ft` = last(`Lahontan.Storageacre-ft`, na.rm = TRUE), `CarsonAtFtChurchill.Gage Inflowcfs` = sum(`CarsonAtFtChurchill.Gage Inflowcfs`, na.rm = TRUE) ) %>% ungroup()
2. 生成完整月度序列并合并
生成1960年1月到2022年12月的完整时间序列,通过左连接确保所有月份都被覆盖:
# 生成目标时间范围的完整月度序列 full_month_seq <- tibble(year_month = seq(ymd("1960-01-01"), ymd("2022-12-01"), by = "month")) # 左连接聚合结果,缺失的月份会填充NA,可按需替换为0或其他值 full_monthly_df <- full_month_seq %>% left_join(monthly_agg, by = "year_month") # 可选:将年月格式转为字符串(如"1960-01") full_monthly_df <- full_monthly_df %>% mutate(year_month = format(year_month, "%Y-%m"))
关键说明
- 用
year_month(年+月)作为分组键,避免单纯按month分组丢失年份维度 - 一次性聚合减少代码冗余,避免多次
ddply后合并的索引错误 - 左连接完整序列确保覆盖1960年代至2022年的所有月度,无缺失时间步长
内容的提问来源于stack exchange,提问作者Koda
相关产品推荐
相关产品推荐

