如何在R或Excel中汇总Block级普查数据生成Tract级数据
把Block级普查数据汇总到Tract级的R解决方案
用基础R的aggregate()搞定
之前你困惑aggregate的语法,其实核心就是「要汇总的列 ~ 分组列」的公式结构,再指定数据集和求和函数就行。
假设你的数据集叫census_data,Tract编码列是Tract_GEOID,举几个实用例子:
- 只汇总
Total_Pop列:
tract_total <- aggregate(Total_Pop ~ Tract_GEOID, data = census_data, FUN = sum)
- 同时汇总多列(比如
Total_Pop、White_Pop、Black_Pop):
tract_multi <- aggregate(cbind(Total_Pop, White_Pop, Black_Pop) ~ Tract_GEOID, data = census_data, FUN = sum)
- 要是数值列太多不想挨个写,就用
.代表所有非分组列,但记得先筛出数值列避免出错:
# 先挑出Tract编码列和所有数值列 num_cols <- sapply(census_data, is.numeric) tract_all <- aggregate(. ~ Tract_GEOID, data = census_data[, c("Tract_GEOID", names(num_cols[num_cols]))], FUN = sum)
嫌基础R麻烦?用dplyr更直观
很多人觉得aggregate的公式语法绕,换dplyr的分组汇总逻辑更清晰,步骤如下:
- 先装包加载:
install.packages("dplyr") library(dplyr)
- 单列汇总:
tract_dplyr_single <- census_data %>% group_by(Tract_GEOID) %>% summarise(Total_Pop = sum(Total_Pop, na.rm = TRUE))
- 多列汇总:
tract_dplyr_multi <- census_data %>% group_by(Tract_GEOID) %>% summarise( Total_Pop = sum(Total_Pop, na.rm = TRUE), White_Pop = sum(White_Pop, na.rm = TRUE), Black_Pop = sum(Black_Pop, na.rm = TRUE) )
- 一键汇总所有数值列:
tract_dplyr_all <- census_data %>% group_by(Tract_GEOID) %>% summarise(across(where(is.numeric), sum, na.rm = TRUE))
加na.rm = TRUE是为了跳过缺失值,防止求和结果变成NA,很实用。
额外提一句:可以直接在R里生成Tract编码
你之前在Excel里删GEOID最后4位得到Tract编码,其实在R里一步就能搞定,省得来回导数据:
# 假设原始GEOID列叫GEOID,提取前11位(示例GEOID是15位,最后4位是Block,15-4=11) census_data$Tract_GEOID <- substr(census_data$GEOID, 1, 11)
内容的提问来源于stack exchange,提问作者Lukas Louwagie
相关产品推荐
相关产品推荐

