如何使用lapply批量处理多年份边境数据CSV文件并生成对应可视化图表
R语言lapply批量处理边境数据实现方案
前置依赖
先确保你已经安装并加载了所有用到的包:
library(readr) library(stringr) library(countrycode) library(plyr) library(ggplot2)
封装单年份处理逻辑
把你对单一年份的处理流程封装为自定义函数,入参为需要处理的年份:
process_border_data <- function(year) { # 1. 读取对应年份的csv文件 file_path <- paste0("Downloads/BorderData/BorderApprehension", year, ".csv") border_data <- read_csv(file_path) # 2. 缺失值替换为0(修正了你原代码里2008年变量名写错的笔误) border_data[is.na(border_data)] <- 0 # 3. 公民身份字段统一首字母大写 border_data$CITIZENSHIP <- str_to_title(border_data$CITIZENSHIP) # 4. 匹配对应区域 border_data$Region <- countrycode(sourcevar = border_data$CITIZENSHIP, origin = "country.name", destination = "region") # 5. 标记总计行(你原代码里第26列是总计列,确认列位置没有变动就可以直接用) border_data[nrow(border_data), 26] <- "Total" # 6. 按区域汇总 world_region <- ddply(border_data, "Region", numcolwise(sum)) # 7. 生成可视化图 p <- ggplot(world_region, aes(x = Region, y = Total)) + geom_col(width = 0.5, position = position_dodge(3), fill = 'blue', alpha = 0.5) + scale_y_log10() + coord_flip() + geom_text(aes(label=Total), alpha = 1.0, check_overlap = TRUE) + ggtitle(paste0("Apprehension By World Region Totals in ", year)) # 可选:如果需要自动保存图片到本地,取消注释下面一行 # ggsave(paste0("border_apprehension_", year, ".png"), plot = p, width = 10, height = 6) # 返回结果,可选返回数据或者直接返回图 return(list(data = border_data, plot = p)) }
用lapply批量处理所有年份
定义你需要处理的所有年份的向量,传入lapply调用上面的函数即可:
# 替换为你实际需要处理的所有年份 target_years <- c(2007, 2008, 2009, 2010, 2011) # 批量执行,结果会存为列表,每个元素对应一个年份的处理结果 all_result <- lapply(target_years, process_border_data) # 如果你要单独提取某一年的图,比如2007年的图,直接取列表第一个元素的plot即可 # print(all_result[[1]]$plot)
注意事项
- 如果你的年份文件有缺失,运行时会报文件不存在的错误,提前核对
target_years里的年份都有对应csv文件即可 - 如果你不需要保留处理后的数据,只需要画图,可以把函数里的return改为直接打印图
print(p)即可 - 原代码里第26列写死为总计列,如果你不同年份的csv列数有差异,建议把固定列号改为列名,比如
border_data$Total[nrow(border_data)] <- "Total"更稳妥
内容的提问来源于stack exchange,提问作者josephtg1
相关产品推荐
相关产品推荐

