R入门者求助:将每日气象数据按周平均聚合
嘿,刚入门R语言遇到这种聚合问题太正常了,我帮你捋清楚怎么搞定!
首先先把你的数据模拟成标准的数据框(方便后续测试):
weather_data <- data.frame( STN = c(235, 235), YYYYMMDD = c(20161231, 20161230), DDVEC = c(227, 227), FHVEC = c(70, 53), FG = c(70, 55), FHX = c(80, 60), FHN = c(60, 30), FXX = c(120, 90), FXXH = c(10, 6), TG = c(80, 52), TN = c(71, -10), TX = c(87, 73), T10N = c(69, -9), Weeknr = c(52, 52) )
接下来给你两种常用的解决方案,都是新手友好的:
方案1:用dplyr包(语法直观,易读性高)
dplyr是R里处理数据的常用包,语法非常贴近自然语言,适合新手:
- 先安装并加载dplyr(如果还没装的话):
install.packages("dplyr") library(dplyr)
- 执行分组聚合操作:
weekly_weather <- weather_data %>% # 按【测量地点(STN) + 周数(Weeknr)】分组,避免不同地点的同周数据混算 group_by(STN, Weeknr) %>% # 对除STN外的所有列计算平均值,na.rm=TRUE用来忽略缺失值 summarise(across(-STN, mean, na.rm = TRUE)) %>% # 取消分组,方便后续操作 ungroup()
方案2:用base R(无需额外安装包)
如果你不想装新包,用R自带的aggregate函数也能搞定:
weekly_weather_base <- aggregate(. ~ STN + Weeknr, data = weather_data, FUN = mean, na.rm = TRUE)
这里的. ~ STN + Weeknr意思是“所有列按照STN和Weeknr分组”,FUN指定用均值函数计算。
额外提醒:注意跨年份的周数问题
你提供的数据里2016年最后两天属于第52周,如果2017年的前几天也属于第52周,直接按Weeknr分组会把两年的数据混在一起。如果需要区分不同年份的同周数,可以先创建一个“年份-周数”的组合列:
weather_data <- weather_data %>% mutate( # 从YYYYMMDD里提取年份 Year = substr(YYYYMMDD, 1, 4), # 组合成年份-周数的格式 Year_Week = paste(Year, Weeknr, sep = "_") ) %>% # 按STN和Year_Week分组聚合 group_by(STN, Year_Week) %>% summarise(across(-c(STN, Year, Year_Week), mean, na.rm = TRUE)) %>% ungroup()
内容的提问来源于stack exchange,提问作者Luuk Appels
相关产品推荐
相关产品推荐

