使用R处理百万警情数据:生成Top20辖区数据框遇空值问题
解决方案
问题根源
你生成空数据框的核心原因是top20$JURISDICTION大概率是因子(factor)类型,和police$JURISDICTION的类型不匹配,导致筛选时无法匹配到数据。
更高效的处理方法
方案1:用split拆分(推荐)
不需要手动循环,一行代码就能完成拆分,还能把所有辖区数据统一存进列表,方便后续批量处理:
# 提取Top20辖区名称并转为字符型 top20_juris <- as.character(top20$JURISDICTION) # 筛选目标数据并按辖区拆分 top20_data_list <- split( police[police$JURISDICTION %in% top20_juris, ], police[police$JURISDICTION %in% top20_juris, ]$JURISDICTION )
- 调用单个辖区数据:
top20_data_list[["XX辖区"]] - 后续做图表时,能结合
purrr包批量生成,比单独维护20个数据框高效得多
方案2:修复循环代码
如果一定要生成单独的全局数据框,修改代码避免因子匹配问题:
top20_juris <- as.character(top20$JURISDICTION) for (juris in top20_juris) { assign(juris, dplyr::filter(police, JURISDICTION == juris)) }
- 直接用辖区名称循环,比按索引循环更直观,同时转字符型解决了匹配失效问题
批量可视化示例
结合ggplot2和purrr可以批量生成所有Top20辖区的图表,比如犯罪类型分布柱状图:
library(purrr) library(ggplot2) # 批量生成图表 top20_plots <- map(top20_data_list, function(df) { ggplot(df, aes(x = 犯罪类型)) + geom_bar(fill = "#2E86AB") + labs(title = paste(df$JURISDICTION[1], "犯罪类型分布"), x = "犯罪类型", y = "警情数量") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) }) # 查看指定辖区图表 top20_plots[["XX辖区"]]
内容的提问来源于stack exchange,提问作者Qats
相关产品推荐
相关产品推荐

