如何在R中按数字正序批量读取有序命名的TXT格式文件
R读取数字序号命名文件乱序解决方案
问题根因
R的list.files()默认按照字符字典序排序,逐位对比字符时,file10.txt的第一位数字为1,优先级高于首数字为2的file2.txt,因此会出现顺序错乱的情况。
解决方案
方案1:提取序号重排序(无需额外安装冷门依赖)
从文件名中提取数字序号后按数值排序,后续读取即可严格遵循1-1000的顺序,还可直接生成文件序号列方便匹配:
library(data.table) library(stringr) # 原逻辑获取文件列表 list_of_files <- list.files(path = ".", recursive = TRUE, pattern = "\\.txt$", full.names = TRUE) # 提取文件名中的数字序号,按数值重排序文件列表 file_nums <- as.integer(str_extract(list_of_files, "(?<=file)\\d+(?=\\.txt)")) list_of_files_sorted <- list_of_files[order(file_nums)] # 按排序后的列表读取文件 DT <- rbindlist(sapply(list_of_files_sorted, fread, simplify = FALSE), use.names = FALSE, idcol = "FileName") # 可选:新增文件序号列,无需依赖读取顺序也能直接匹配文件编号 DT[, file_id := as.integer(str_extract(FileName, "(?<=file)\\d+(?=\\.txt)"))]
方案2:用自然排序函数直接处理
如果已安装gtools包,可直接调用内置的自然排序方法:
library(data.table) library(gtools) # 直接用mixedsort做自然排序,得到按数字顺序排列的文件列表 list_of_files <- mixedsort(list.files(path = ".", recursive = TRUE, pattern = "\\.txt$", full.names = TRUE)) # 后续读取逻辑和原代码一致 DT <- rbindlist(sapply(list_of_files, fread, simplify = FALSE), use.names = FALSE, idcol = "FileName")
内容的提问来源于stack exchange,提问作者flkp5622
相关产品推荐
相关产品推荐

