如何通过列表映射批量left_join多组关联表格?
问题原因
你的代码里tab_list存的是表格名称的字符串,但left_join需要的是实际的数据框对象,直接传字符串肯定没法运行;另外paste0(.x, "_2021")得到的也是字符串,没法直接用select这类dplyr函数处理。
两种解决方案
方案一:用get()获取环境中的表格对象
直接修改你原有的map代码,用get()把字符串转换成对应的表格对象:
library(dplyr) library(purrr) # 你的原始表格定义...(省略重复代码) tab_list <- c("T1", "T2") # 修正后的map代码 result_list <- map(tab_list, function(tab_name) { # 获取2022年的表格 tab_2022 <- get(tab_name) # 获取2021年的对应表格,处理列名 tab_2021_processed <- get(paste0(tab_name, "_2021")) %>% select(Variable, Total) %>% rename(`2021` = Total) # 合并 left_join(tab_2022, tab_2021_processed, by = "Variable") }) # 给结果列表命名,方便识别 names(result_list) <- tab_list
方案二:提前把表格放进列表(更推荐)
如果表格数量很多,把2022和2021的表格分别放进列表,再对应合并,比依赖环境变量更安全清晰:
library(dplyr) library(purrr) # 把2022年的表格放进列表 tabs_2022 <- list(T1 = T1, T2 = T2) # 把2021年的表格放进列表,命名和2022对应 tabs_2021 <- list(T1 = T1_2021, T2 = T2_2021) # 对应合并两个列表中的表格 result_list <- map2(tabs_2022, tabs_2021, function(tab22, tab21) { tab21_processed <- tab21 %>% select(Variable, Total) %>% rename(`2021` = Total) left_join(tab22, tab21_processed, by = "Variable") })
扩展:回溯4年的批量处理
如果要处理4年的数据(比如2019-2022),可以把每年的表格按年份分组放进嵌套列表,然后依次合并:
# 假设你有2019-2021的表格,命名比如T1_2019, T1_2020, T2_2019等 tabs_by_year <- list( "2022" = list(T1 = T1, T2 = T2), "2021" = list(T1 = T1_2021, T2 = T2_2021), "2020" = list(T1 = T1_2020, T2 = T2_2020), "2019" = list(T1 = T1_2019, T2 = T2_2019) ) # 从2022开始,依次合并前一年的数据 result <- tabs_by_year[["2022"]] for (year in c("2021", "2020", "2019")) { result <- map2(result, tabs_by_year[[year]], function(current, prev) { prev_processed <- prev %>% select(Variable, Total) %>% rename(!!year := Total) left_join(current, prev_processed, by = "Variable") }) }
内容的提问来源于stack exchange,提问作者Benjamin Fretwurst
相关产品推荐
相关产品推荐

