无需dplyr:如何直接聚合sf空间数据框按cod_area分组的多边形值?
sf数据框按cod_area聚合val值的非dplyr解决方案
如果不想用dplyr,直接用sf包自带的aggregate()函数就能搞定,不需要先聚合再合并的繁琐步骤,还能避免geometry聚合时的类型错误。
方法一:sf自带aggregate函数(最直接)
因为每个cod_area对应唯一的多边形,直接按cod_area分组对val求和,同时保留对应的空间几何:
sf_agg <- aggregate(sf.data["val"], by = list(cod_area = sf.data$cod_area), FUN = sum, do_union = FALSE)
- 参数说明:
sf.data["val"]:指定要聚合的数值列by:按cod_area分组do_union = FALSE:因为同一cod_area的几何是同一个,不需要自动合并多边形,避免不必要的空间运算
- 验证结果:
直接查看目标cod_area的求和结果:sf_agg[sf_agg$cod_area == 34275, "val"] # 应返回4729.167 sf_agg[sf_agg$cod_area == 34347, "val"] # 应返回13901.75
方法二:base R原生函数组合
如果偏好纯base R写法,也可以用by()分组计算后再组合成sf对象:
# 分组求和val agg_result <- by(sf.data$val, sf.data$cod_area, sum) # 转成数据框 agg_df <- data.frame( cod_area = as.integer(names(agg_result)), val = as.numeric(agg_result) ) # 匹配对应几何(去重后保留唯一多边形) sf_agg <- merge( agg_df, sf.data[, c("cod_area", "geometry")], by = "cod_area", all.x = TRUE ) sf_agg <- sf_agg[!duplicated(sf_agg$cod_area), ] # 确保是sf空间对象 sf_agg <- st_as_sf(sf_agg)
为什么之前按geometry聚合会出错?
直接按geometry聚合时,哪怕是同一cod_area的多边形,若存在浮点精度差异,会被识别为不同几何组;而且聚合空间几何需要专门的空间合并函数,容易触发类型不匹配。正确的思路是按业务标识cod_area分组,而非空间几何本身。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

