R语言多年份数据集中国家数据提取函数的优化及可变参数需求问询
R语言多年份数据集中国家数据提取函数的优化及可变参数需求问询
你好!你的思路非常合理——先对每个大年份数据集做筛选,再合并结果,确实比先把所有大数据集合并再筛选要高效得多,能省下不少计算资源,这点抓得很准。针对你的两个需求,我给你整理了几种优化方案:
一、简化函数,避免重复代码
你原来的函数里重复写了8次filter逻辑,不仅冗余,以后要是新增年份(比如2022)还得修改函数参数和代码,扩展性很差。我们可以用列表批量处理的方式来简化:
方案1:传入数据集列表(推荐,扩展性最强)
把所有年份的数据集放进一个列表里,然后用批量映射的方式完成筛选和合并:
library(dplyr) library(purrr) Extract_Data <- function(data_list, countries) { # 对列表中的每个数据集批量筛选目标国家 filtered_datasets <- map(data_list, ~filter(.x, Country %in% countries)) # 合并所有筛选后的小数据集 bind_rows(filtered_datasets) }
使用的时候只需要先把年份数据整理成列表:
# 把你的8个年份数据集放进列表 yearly_data <- list( data2014, data2015, data2016, data2017, data2018, data2019, data2020, data2021 ) # 提取单个国家 Extract_Data(yearly_data, "Germany") # 提取多个国家 Extract_Data(yearly_data, c("China", "USA", "Japan"))
方案2:保留原参数风格(兼容你的使用习惯)
如果你习惯原来直接传入单个年份数据集的方式,可以用可变参数...来接收所有年份数据,内部再转成列表处理:
library(dplyr) library(purrr) Extract_Data <- function(countries, ...) { # 把传入的所有年份数据集转成列表 data_list <- list(...) filtered_datasets <- map(data_list, ~filter(.x, Country %in% countries)) bind_rows(filtered_datasets) }
调用方式和你原来的类似,只是把国家参数放在前面:
# 提取多个国家 Extract_Data(c("Brazil", "India"), data2014, data2015, data2016, data2017, data2018, data2019, data2020, data2021)
方案3:不用tidyverse,用base R实现
如果你不想加载tidyverse包,用base R的lapply和do.call也能完成:
Extract_Data <- function(data_list, countries) { filtered_datasets <- lapply(data_list, function(df) { df[df$Country %in% countries, ] }) do.call(rbind, filtered_datasets) }
二、支持任意数量的国家筛选
核心就是把原来的Country == var1改成Country %in% countries——%in%可以匹配向量中的任意值,不管你传1个、3个还是5个国家都没问题。
额外小贴士
- 如果不同年份的数据集列名不完全一致,
bind_rows会自动把缺失的列填充为NA,如果需要严格匹配列名,可以在map里加一步select来统一列,比如:filtered_datasets <- map(data_list, ~.x %>% select(Country, Year, 其他需要的列) %>% filter(Country %in% countries)) - 如果你想给合并后的数据集加上年份标识,可以在映射的时候给每个数据集加个
Year列(前提是列表有年份命名):# 先给列表命名为对应年份 yearly_data <- list( "2014" = data2014, "2015" = data2015, "2016" = data2016, "2017" = data2017, "2018" = data2018, "2019" = data2019, "2020" = data2020, "2021" = data2021 ) # 映射时添加年份列 filtered_datasets <- imap(data_list, ~.x %>% mutate(Year = .y) %>% filter(Country %in% countries))
备注:内容来源于stack exchange,提问作者iturrizaga
相关产品推荐
相关产品推荐

