如何根据DataFrame列片段匹配文件名并移动对应文件?
基于DataFrame片段匹配的文件移动实现
核心思路
无需先提取文件名片段再硬匹配,直接用DataFrame中的目标片段生成正则匹配规则,筛选出包含任意目标片段的文件后批量移动。这种方式利用R的向量化操作,效率远高于循环实现。
完整实现代码
library(filesstrings) library(stringr) library(dplyr) move_files_by_df_fragment <- function(current_folder, new_folder, target_df, fragment_col) { # 获取目标文件夹下所有文件的完整路径 all_files <- list.files(current_folder, full.names = TRUE, recursive = TRUE) # 从DataFrame中提取需匹配的片段,去重避免重复匹配 target_fragments <- target_df %>% pull({{fragment_col}}) %>% unique() # 生成正则规则:匹配任意一个目标片段 match_pattern <- str_c(target_fragments, collapse = "|") # 筛选出包含目标片段的文件 matched_files <- str_subset(all_files, match_pattern) # 执行移动操作(先判断是否有匹配文件) if (length(matched_files) > 0) { move_files(matched_files, new_folder, overwrite = FALSE) cat("成功移动", length(matched_files), "个文件\n") } else { cat("未找到匹配的文件\n") } }
使用示例
假设你的DataFrame名为my_df,存储匹配片段的列名为target_segment,调用方式如下:
# 示例数据框 my_df <- data.frame(target_segment = c("181009_153350", "123439_152450")) # 调用函数执行移动 move_files_by_df_fragment( current_folder = "/users/documents/data/", new_folder = "/users/documents/target/", target_df = my_df, fragment_col = target_segment )
关键说明
- 向量化效率:用
str_subset和正则匹配替代手动循环,处理大量文件时性能提升显著。 - 去重处理:对DataFrame中的片段去重,避免重复筛选同一文件。
- 安全校验:先判断是否存在匹配文件再执行移动,避免空操作引发报错。
你原有代码的问题
compare2函数的逻辑是逐元素完全相等匹配,但需求是文件名包含目标片段,逻辑不匹配。- 嵌套循环的效率极低,在处理大量文件或大数据框时会严重拖慢运行速度,违背R的向量化设计优势。
内容的提问来源于stack exchange,提问作者TrentonS36
相关产品推荐
相关产品推荐

