如何用purrr合并含共同年份列表的路径与文件名生成完整路径?
用purrr生成对应年份的文件路径解决方案
你现在的问题核心是要保证子目录的年份和文件名里的年份完全对应,之前分开生成filename和filepath的方式会导致两者长度不匹配(filename是8个组合,filepath是4个),没法直接合并。我给你几个更直接的purrr实现思路:
方法1:直接用cross2+map一步生成完整路径
这是最简洁的方式,直接把country和year的组合作为输入,在map里一次性拼接出符合要求的完整路径:
library(tidyverse) year_list <- c(2008,2009,2010, 2011) country_list <- c("Andorra","Belarus") remote_base_path <- "some_path" # 生成所有country+year的组合,再逐个构建完整路径 full_paths <- cross2(country_list, year_list) %>% map(function(elem) { country <- elem[[1]] year <- elem[[2]] # 拼接路径:基础路径 -> 年份子目录 -> 带年份的文件名 file.path(remote_base_path, as.character(year), paste0(country, "_", year, ".xls")) }) # 查看结果 full_paths
运行后你会得到每个国家-年份对应的完整路径,比如some_path/2008/Andorra_2008.xls,完全符合你的要求。
方法2:用pmap配合数据框批量生成
如果你习惯用数据框来管理组合关系,可以先把所有参数组合成数据框,再用pmap批量处理:
# 生成包含所有参数组合的数据框 path_params <- expand.grid( country = country_list, year = year_list, base_path = remote_base_path, stringsAsFactors = FALSE ) # 用pmap逐个生成路径 full_paths <- pmap(path_params, function(country, year, base_path) { file.path(base_path, as.character(year), paste0(country, "_", year, ".xls")) })
这种方式的好处是参数关系更直观,后续如果要调整路径规则,修改数据框或pmap里的逻辑都很方便。
方法3:基于你现有代码的改进方案
如果你想保留之前生成filename和filepath的步骤,可以给两者加上年份标签,再通过年份匹配合并:
# 生成带年份标签的文件名列表 filename_with_year <- cross3(country_list, year_list, ".xls") %>% map(lift(paste0)) %>% # 给每个文件名绑定对应的年份(注意重复顺序:每个年份对应2个国家) map2(rep(year_list, each = length(country_list)), ~list(name = .x, year = .y)) # 生成带年份标签的路径前缀列表 filepath_with_year <- cross2(remote_base_path, year_list) %>% map(lift(file.path)) %>% map2(year_list, ~list(path = .x, year = .y)) # 按年份匹配,合并路径和文件名 full_paths <- map(filename_with_year, function(fn_item) { # 找到对应年份的路径前缀 matched_path <- filepath_with_year %>% keep(~.x$year == fn_item$year) %>% pluck(1, "path") # 拼接成完整路径 file.path(matched_path, fn_item$name) })
不过这种方法相对繁琐,更推荐前两种直接生成的方式。
内容的提问来源于stack exchange,提问作者Lod
相关产品推荐
相关产品推荐

