如何在R中按文件名特征对加载的CSV文件列表排序
问题:按文件名的自然顺序重新排序R中的文件路径列表
相关代码及数据集可在我的GitHub仓库获取。我用以下代码将20个独立CSV数据集加载到R中:
# 这两行代码生成数据集文件夹中所有文件名的字符列表 directory_paths <- "~/GMU folders (local)/DAEN_698/other datasets/sample obs(20 csvs)" filepaths_list <- list.files(path = directory_paths, full.names = TRUE, recursive = TRUE) > head(filepaths_list, 4) [1] "C:/Users/Spencer/Documents/GMU folders (local)/DAEN_698/other datasets/sample obs(20 csvs)/0-3-1-1.csv" [2] "C:/Users/Spencer/Documents/GMU folders (local)/DAEN_698/other datasets/sample obs(20 csvs)/0-3-1-10.csv" [3] "C:/Users/Spencer/Documents/GMU folders (local)/DAEN_698/other datasets/sample obs(20 csvs)/0-3-1-11.csv" [4] "C:/Users/Spencer/Documents/GMU folders (local)/DAEN_698/other datasets/sample obs(20 csvs)/0-3-1-12.csv"
但实际文件夹中的CSV文件是按自然顺序排列的——比如0-3-1-1、0-3-1-2...0-3-1-9、0-3-1-10这样的顺序,而当前生成的filepaths_list排序混乱,是按文件名第四个部分的单个字符排序的,导致1之后直接是10而非2。我需要将其重新排序为文件夹中的自然顺序。
我之前尝试了以下代码,但修改这个名称列表无法同步调整实际的文件路径列表:
# 格式化每个CSV数据集的名称 DS_names_list <- basename(filepaths_list) DS_names_list <- tools::file_path_sans_ext(DS_names_list) > DS_names_list [1] "0-3-1-1" "0-3-1-10" "0-3-1-11" "0-3-1-12" "0-3-1-13" "0-3-1-14" "0-3-1-15" "0-3-1-16" [9] "0-3-1-17" "0-3-1-18" "0-3-1-19" "0-3-1-2" "0-3-1-20" "0-3-1-3" "0-3-1-4" "0-3-1-5" [17] "0-3-1-6" "0-3-1-7" "0-3-1-8" "0-3-1-9"
补充说明:文件名中的每个数字对应回归模型的属性:
- n1:所有回归变量间的多重共线性程度(取值为0、0.4或1)
- n2:底层结构模型中的真实回归变量数量
- n3:真实模型的误差方差
- n4:具备前三个特征的数据集的随机变体编号,范围为1-500
解决方案
要实现自然排序,有两种简单可行的方法:
方法1:使用gtools包的mixedsort函数
# 安装并加载gtools包 install.packages("gtools") library(gtools) # 对文件路径列表进行自然排序 sorted_filepaths <- mixedsort(filepaths_list) # 验证排序结果 head(sorted_filepaths, 4)
方法2:使用stringr包的str_sort函数
# 安装并加载stringr包 install.packages("stringr") library(stringr) # 设置numeric=TRUE参数实现自然排序 sorted_filepaths <- str_sort(filepaths_list, numeric = TRUE) # 验证排序结果 head(sorted_filepaths, 4)
两种方法都能让filepaths_list按照文件名的自然顺序排列,和文件夹中的排序一致。
内容的提问来源于stack exchange,提问作者Marlen
相关产品推荐
相关产品推荐

