You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:46:07