在R中对多年DataFrame按日期小时计算统计量并实现管道式处理
按日期小时分组计算多变量统计量的dplyr实现
你可以直接在现有合并数据的管道后继续操作,完成按月-日 小时:分:秒分组并计算均值、最大值、最小值的需求,以下是完整实现:
基础实现代码
WaterData <- BUSdata %>% left_join(MBdata, by = "datetime") %>% left_join(SUSdata, by = "datetime") %>% # 提取月-日 时分秒作为分组标识 mutate(group_datetime = format(datetime, "%m-%d %H:%M:%S")) %>% # 按统一的月日小时分组 group_by(group_datetime) %>% # 计算每个变量的均值、最大值、最小值 summarise( BUSwt_mean = mean(BUSwt, na.rm = TRUE), BUSwt_max = max(BUSwt, na.rm = TRUE), BUSwt_min = min(BUSwt, na.rm = TRUE), MBwt_mean = mean(MBwt, na.rm = TRUE), MBwt_max = max(MBwt, na.rm = TRUE), MBwt_min = min(MBwt, na.rm = TRUE), SUSwt_mean = mean(SUSwt, na.rm = TRUE), SUSwt_max = max(SUSwt, na.rm = TRUE), SUSwt_min = min(SUSwt, na.rm = TRUE) ) %>% # 重命名分组列为datetime,匹配期望输出格式 rename(datetime = group_datetime) %>% # 按时间顺序排序(可选,提升可读性) arrange(datetime)
代码分步说明
mutate(...):将原始datetime格式转换为%m-%d %H:%M:%S(月-日 小时:分:秒)的字符串,这样能把5年中同一月日同一小时的数据归为一组。group_by(group_datetime):基于转换后的时间字符串进行分组。summarise(...):对每个分组计算三个变量的均值、最大值、最小值,na.rm = TRUE用于忽略缺失值,避免统计结果出现NA。rename(...):将分组列重命名为datetime,完全匹配你期望的输出表头。arrange(datetime):可选步骤,让结果按时间顺序排列,方便查看。
简化版(适合多变量场景)
如果后续变量增多,可使用across函数减少重复代码:
WaterData <- BUSdata %>% left_join(MBdata, by = "datetime") %>% left_join(SUSdata, by = "datetime") %>% mutate(group_datetime = format(datetime, "%m-%d %H:%M:%S")) %>% group_by(group_datetime) %>% summarise( across(c(BUSwt, MBwt, SUSwt), list(mean = ~mean(., na.rm = TRUE), max = ~max(., na.rm = TRUE), min = ~min(., na.rm = TRUE))) ) %>% # 调整列名格式(默认是"变量名_函数名",和需求格式一致) rename(datetime = group_datetime) %>% arrange(datetime)
across函数会自动为每个变量生成变量名_mean、变量名_max、变量名_min格式的列,无需手动逐个定义。
内容的提问来源于stack exchange,提问作者Ryan Gary
相关产品推荐
相关产品推荐

