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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:55:14