基于地块ID统计不同Mapbiomas编码的areaHA总和的技术问询
问题解决:按ID分组统计Mapbiomas编码对应的面积总和
问题原因
你当前代码的问题在于:在summarise里直接使用a.col.df$areaHa[a.col.df$mapbiomas=='1']是全局引用整个数据集的列,完全忽略了group_by(ID)的分组上下文。不管当前分组是哪个ID,都会计算全表中mapbiomas等于'1'的所有areaHa总和,所以所有ID返回的结果完全相同。
解决方案
根据你的需求,提供几种可行的代码写法:
1. 单独统计某一个Mapbiomas编码的面积(比如编码'1')
先过滤出目标编码,再按ID分组求和:
a.col.df %>% filter(mapbiomas == '1') %>% group_by(ID) %>% summarise(total_area_code1 = sum(areaHa))
2. 统计所有目标编码的面积,按ID+编码分组展示
一次性处理多个编码(1、9、15、21),结果按ID和编码分行显示:
a.col.df %>% filter(mapbiomas %in% c('1', '9', '15', '21')) %>% group_by(ID, mapbiomas) %>% summarise(total_area = sum(areaHa))
3. 将不同编码的面积转为宽格式(每个编码一列)
如果需要把每个ID对应的不同编码面积放在同一行,可以用tidyr::pivot_wider:
library(tidyr) a.col.df %>% filter(mapbiomas %in% c('1', '9', '15', '21')) %>% group_by(ID, mapbiomas) %>% summarise(total_area = sum(areaHa)) %>% pivot_wider( names_from = mapbiomas, values_from = total_area, values_fill = 0 # 没有对应编码的ID填充0 )
关键注意点
在dplyr的分组操作中,不要用数据框$列名的方式引用列,直接写列名即可,这样dplyr会自动在当前分组范围内计算,而不是调用全表数据。
内容的提问来源于stack exchange,提问作者Patrick Fernandes
相关产品推荐
相关产品推荐

