R语言:根据文件名匹配文件路径并保留NA值的实现需求
R实现文件名与文件路径匹配(保留NA值、多匹配项分号分隔)
需求说明
- 将
File_names中的文件名与File_paths中的文件路径进行匹配 - 保留
NA值对应的行,不删除 - 若一行包含多个用分号分隔的文件名,匹配到的路径也用分号分隔返回
- 最终输出包含
File_name和匹配后File_path的数据框
输入数据
File_paths <- c("C:/temp/1245~b~cat~v4.jpeg", "C:/temp/1245~b~dog~v4.jpeg", "C:/temp/1245~b~cow~v4.jpeg", "C:/temp/1245~b~duck~v4.jpeg", "C:/temp/1245~b~horse~v4.jpeg", "C:/temp/1245~b~goat~v4.jpeg") File_names <- c("b~cat", "b~dog", "NA", "b~duck", "b~goat; b~horse", "NA", "b~cow")
解决方案代码
使用dplyr和stringr包实现需求,代码如下:
library(dplyr) library(stringr) # 构建结果数据框 result_df <- tibble(File_name = File_names) %>% mutate( # 拆分多文件名,NA值单独处理 File_name_split = if_else(File_name == "NA", list(NA), str_split(File_name, "; ")), # 遍历每个文件名列表,匹配对应路径并合并 File_path = map_chr(File_name_split, function(names) { if (is.na(names)) { NA_character_ } else { matched_paths <- sapply(names, function(name) { File_paths[str_detect(File_paths, fixed(name))] }) paste(matched_paths, collapse = "; ") } }) ) %>% select(File_name, File_path) # 查看输出结果 print(result_df, width = Inf)
代码解释
- 用
tibble初始化数据框,保留原始File_name列 str_split按;拆分多文件名,NA值处理为包含NA的列表,保证后续遍历统一map_chr遍历每个文件名列表:- 若为NA,直接返回NA字符串
- 非NA时,用
str_detect(fixed(name))精准匹配包含对应文件名的路径,避免模糊匹配错误 - 最后用
paste将多个匹配路径合并为分号分隔的字符串
- 保留
File_name和File_path两列,得到目标数据框
输出结果
# A tibble: 7 × 2 File_name File_path <chr> <chr> 1 b~cat C:/temp/1245~b~cat~v4.jpeg 2 b~dog C:/temp/1245~b~dog~v4.jpeg 3 NA NA 4 b~duck C:/temp/1245~b~duck~v4.jpeg 5 b~goat; b~horse C:/temp/1245~b~goat~v4.jpeg; C:/temp/1245~b~horse~v4.jpeg 6 NA NA 7 b~cow C:/temp/1245~b~cow~v4.jpeg
内容的提问来源于stack exchange,提问作者HiAlllllll
相关产品推荐
相关产品推荐

