在R语言中按多类别计算网格内建筑面积占比
R语言实现网格内建筑类别占地面积占比计算
可以借助dplyr和tidyr包完成需求,以下是具体实现步骤:
1. 加载所需包
library(dplyr) library(tidyr)
2. 数据处理代码
# 处理数据,按网格分组计算占比 result <- data_subset %>% # 按网格ID和建筑类别分组,统计每个类别的总占地面积 group_by(grid_id_2, new_bu_class) %>% summarise(class_area = sum(building_area_in), .groups = "drop_last") %>% # 计算当前网格的总建筑面积 mutate(total_area = sum(class_area)) %>% # 计算类别面积占网格基准面积(area列值)的比例,可按需调整分母 mutate(prop = class_area / first(area)) %>% # 将长格式转为宽格式,每个类别对应一列占比 pivot_wider( id_cols = c(grid_id_2, total_area), names_from = new_bu_class, values_from = c(class_area, prop), values_fill = 0 # 无对应类别的填充0 ) %>% # 重命名列以匹配预期输出 rename( class_propotion_Others = prop_Others, class_propotion_Public = prop_Public, area = first(data_subset$area) ) %>% # 生成building_area_in列:取对应类别的总面积 mutate(building_area_in = ifelse(class_propotion_Public > 0, class_area_Public, class_area_Others)) %>% # 生成new_bu_class列:标记当前网格的对应类别 mutate(new_bu_class = ifelse(class_propotion_Public > 0, "Public", "Others")) %>% # 调整列顺序,保留三位小数 select(grid_id_2, building_area_in, area, new_bu_class, class_propotion_Others, class_propotion_Public, total_area) %>% mutate(across(starts_with("class_propotion"), ~round(., 3)))
3. 结果说明
- 代码会自动忽略
building_area_in为0的行对总和的影响 - 无对应建筑类别的网格,占比列会填充0
- 若需计算类别占网格内总建筑面积的比例,可将占比计算的分母改为
total_area
内容的提问来源于stack exchange,提问作者Yasumin
相关产品推荐
相关产品推荐

