R语言基于两个数据框聚合取值计算疫情率并绘制分级统计图
解决办法
1. 数据关联与指标计算
你需要先汇总clean_df的月度街道级病例、死亡数据,再关联indo_filter_3的人口和空间几何数据,再计算目标指标,示例代码如下:
library(dplyr) library(tmap) library(sf) # 汇总+关联+计算指标 stat_df <- clean_df %>% # 按省/市/区/街道/月份分组,避免同名街道匹配错误 group_by(Province, City, District, Sub_District, Month) %>% summarise( total_cases = sum(as.numeric(Cases), na.rm = TRUE), total_death = sum(as.numeric(Death), na.rm = TRUE), .groups = "drop" ) %>% # 关联空间表的人口、几何数据 left_join( indo_filter_3 %>% select(Province, City, District, Sub_District, Total_Population), by = c("Province", "City", "District", "Sub_District") ) %>% # 计算每万人口的累计确诊率、死亡率 mutate( cases_per_10k = total_cases / Total_Population * 10000, death_per_10k = total_death / Total_Population * 10000 ) %>% # 转为sf空间对象,保留几何属性 st_sf(sf_column_name = "Geometry")
2. 绘制分级统计地图
如果需要按月份分开展示,可以直接用tmap的分面功能实现:
tmap_mode("plot") # 绘制每万人口累计确诊率月度地图 tm_shape(stat_df) + tm_fill( col = "cases_per_10k", title = "每万人口累计确诊数", style = "quantile", # 可调整分箱规则,如kmeans、jenks等 n = 5 ) + tm_borders(alpha = 0.5) + tm_facets(by = "Month", nrow = 2) + # 按月份分面,可调整行列数 tm_layout(legend.position = c("left", "bottom")) # 如需绘制死亡率,将tm_fill的col参数改为death_per_10k即可
注意事项
- 若存在匹配不上人口数据的街道,会生成NA值,可加
filter(!is.na(Total_Population))过滤无效记录 - 若
indo_filter_3的人口是村级粒度,需要先按街道分组汇总得到街道总人口,再做后续关联计算 - 月份数量较多时可调整
tm_facets的nrow、ncol参数优化布局
内容的提问来源于stack exchange,提问作者Lostguy97
相关产品推荐
相关产品推荐

