R语言合并文件排序异常:如何按1-14顺序合并文件?
解决R语言合并文件时的顺序问题
你碰到的这个问题其实很常见——list.files()默认是按字符串顺序排序的,而不是我们直觉里的数值顺序。举个例子,字符串"11"会比"1"排在前面,因为逐字符比较时,第二个位置的"1"比"_"的ASCII码更小(数字的ASCII码比下划线低),所以11_xxx.out就跑到1_xxx.out前面去了。
下面给你两种靠谱的解决办法,按你的需求来选:
方法一:提取文件名中的数字并按数值排序(推荐)
这个方法不用改文件名,直接在R里处理排序,步骤清晰:
- 先获取所有目标文件:
i <- "你的前缀" # 替换成你实际的前缀,比如你原来代码里的i值 files <- list.files(pattern = paste0(i, "_[0-9]+.out"))
- 从每个文件名里提取对应的编号数字(比如从
sample_1.out里提取1):
我们用基础R的正则表达式来提取,不用额外装包:
# 正则匹配前缀后的数字部分,转换成整数 file_numbers <- as.integer(gsub(paste0("^", i, "_([0-9]+)\\.out$"), "\\1", files))
- 按数字顺序重新排列文件列表:
sorted_files <- files[order(file_numbers)]
- 最后按排序后的列表合并文件(用
lapply+do.call比循环更高效):
DF <- do.call(rbind, lapply(sorted_files, function(file) { read.table(file, header = TRUE) }))
这样合并后的DF就是严格按1到14的顺序排列的了。
方法二:统一文件名的数字位数(可选)
如果你愿意修改文件名,可以把1-9的文件名改成带前导零的格式(比如sample_01.out、sample_02.out...),这样字符串排序就会和数值排序一致。不过这个方法需要手动或用脚本批量修改文件名,不如方法一灵活。
另外提个小建议:如果你的数据量比较大,用data.table包的rbindlist会比rbind快很多,用法也类似:
library(data.table) DF <- rbindlist(lapply(sorted_files, fread, header = TRUE))
内容的提问来源于stack exchange,提问作者user3224522
相关产品推荐
相关产品推荐

