R语言sf对象按空间点分组计算气温多年均值方法
问题根因
未指定分组维度直接调用summarise()时,函数会对数据集全量记录做全局聚合,返回整表的统计结果,最终所有空间点都会得到完全相同的均值。
月尺度气温数据集属于典型长表结构时空数据:单个空间点对应480条(40年*12个月)时序记录,要得到每个点的独立均值,必须先按空间点的唯一标识拆分分组,再逐组做聚合计算。
实现步骤
- 预处理:确认空间点唯一标识
如果你的sf数据集没有能区分每个独立空间点的ID列,先手动生成唯一ID,已有site_id/point_id这类标识列可跳过该步:
library(sf) library(dplyr) # 为每个空间点生成唯一标识 temp_sf <- temp_sf %>% mutate(point_uid = seq_len(n()))
- 分组聚合计算均值
核心是先按点的唯一ID分组,再执行统计计算,聚合后会自动保留每个点对应的空间几何,不需要额外做几何关联:
temp_avg_sf <- temp_sf %>% group_by(point_uid) %>% # 按单个空间点分组,是得到逐点结果的核心 summarise( AvgTMean = mean(tmean, na.rm = TRUE), AvgTMin = mean(TMin, na.rm = TRUE), AvgTMax = mean(TMax, na.rm = TRUE), .groups = "drop" )
注意事项
- 必须加
na.rm = TRUE参数:长时序月值数据普遍存在缺测,不加该参数时,只要某点的时序里存在1个缺失值,该点的均值就会返回NA - 结果校验:聚合完成后,输出sf对象的行数应该和原始数据里的独立空间点总数完全一致,几何类型仍为
POINT,不存在几何合并的情况 - 结果可直接用于交互式绘图:输出的
temp_avg_sf是标准sf格式,可直接传入leaflet、mapview等包绘制气温空间分布地图,不需要额外做格式转换。
错误写法复现
以下就是导致全点均值一致的错误写法,未分组直接聚合会返回全局均值+合并后的单个几何:
wrong_result <- temp_sf %>% summarise( AvgTMean = mean(tmean, na.rm = TRUE), AvgTMin = mean(TMin, na.rm = TRUE), AvgTMax = mean(TMax, na.rm = TRUE) )
该写法输出的结果只有1行记录,后续关联到所有空间点时,自然会出现全数据集均值完全一致的问题。
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

