求助:使用list.files()加载编号CSV文件时顺序错乱
解决CSV文件按数字顺序加载的问题
问题原因
list.files()默认按字符顺序排序文件名,字符比较中"10"会排在"2"前面(因为首字符"1"的ASCII码小于"2"),所以才会出现spec_cap1之后直接是spec_cap10、spec_cap11的情况。另外你用的正则spec_cap[1-77].csv是错误的——[]仅匹配单个字符范围,[1-77]实际只匹配"1"和"7"两个数字,根本无法覆盖1到77的所有文件。
解决方案1:提取文件名中的数字重新排序
通过正则提取文件名里的数字,转成整数后按数字大小排序:
# 获取所有符合命名规则的CSV文件 files <- list.files(pattern = "^spec_cap\\d+\\.csv$") # 提取数字并按数字顺序排序文件列表 files_sorted <- files[order(as.integer(sub("spec_cap(\\d+)\\.csv", "\\1", files)))] # 按正确顺序读取并合并文件 combined_files <- bind_rows(lapply(files_sorted, fread))
解决方案2:直接生成有序文件名列表
既然明确知道文件是spec_cap1到spec_cap77,直接按数字生成文件名更稳妥,还能检查文件是否存在:
# 生成1到77的有序文件名 files_sorted <- sprintf("spec_cap%d.csv", 1:77) # 可选:检查文件是否存在,避免读取不存在的文件报错 missing_files <- files_sorted[!file.exists(files_sorted)] if(length(missing_files) > 0) { warning(paste("缺失文件:", paste(missing_files, collapse = ", "))) } # 读取存在的文件并合并 combined_files <- bind_rows(lapply(files_sorted[file.exists(files_sorted)], fread))
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

