如何在R语言中通过索引移除list.files()生成向量中的指定文件名
批量读取并合并Excel文件(排除指定文件)
问题背景
需要程序化读取一批Excel文件,合并为单个数据集后导出新文件。常规用list.files()和for循环实现,但本次需排除路径中包含"no"或"negative"的文件,且无法移动目录内文件。之前尝试生成待移除文件的索引后用vec1[-c(rm.files)]移除,但未成功,需要正确实现方法。
原尝试代码:
library(tidyverse) vec1 <- c('C:/yes/file.xlsx','C:/yes/file.xlsx','C:/yes/file.xlsx', 'C:/no/file.xlsx','C:/no/file.xlsx','C:/yes/file.xlsx', 'C:/yes/file.xlsx','C:/yes/file.xlsx','C:/negative/file.xlsx') vec1 rm.files <- vec1 %>% str_locate(c('no')) %>% data.frame() %>% coalesce(vec1 %>% str_locate('negative') %>% data.frame()) %>% na.omit() %>% rownames() rm.files
解决方案
方法一:直接筛选保留文件(推荐)
用str_detect一步筛选出符合要求的文件路径,无需生成删除索引:
library(tidyverse) vec1 <- c('C:/yes/file.xlsx','C:/yes/file.xlsx','C:/yes/file.xlsx', 'C:/no/file.xlsx','C:/no/file.xlsx','C:/yes/file.xlsx', 'C:/yes/file.xlsx','C:/yes/file.xlsx','C:/negative/file.xlsx') # 筛选不包含"no"或"negative"的文件 keep_files <- vec1[!str_detect(vec1, "no|negative")] keep_files
str_detect检查每个路径是否包含目标字符串,!取反后得到需要保留的文件列表。如果需要忽略大小写,可改为regex("no|negative", ignore_case = TRUE)。
方法二:修正索引删除逻辑
如果坚持用索引删除,需将原代码得到的字符型行号转为数值型,或者直接用which获取数值索引:
# 获取需要删除的文件索引 rm_indices <- which(str_detect(vec1, "no|negative")) # 移除对应文件 keep_files <- vec1[-rm_indices] keep_files
原代码中rownames()返回的是字符格式的行号(如"4"),R的索引需要数值型,直接使用会出错,转成数值或用which生成数值索引即可解决。
后续批量读取与合并
拿到keep_files后,可借助readxl包批量读取并合并文件:
library(readxl) # 批量读取所有保留的Excel文件并合并为数据框 combined_data <- map_dfr(keep_files, read_excel) # 导出合并结果为CSV write_excel_csv(combined_data, "合并后的数据集.csv") # 或导出为Excel文件 write_xlsx(combined_data, "合并后的数据集.xlsx")
内容的提问来源于stack exchange,提问作者dandrews
相关产品推荐
相关产品推荐

