如何按列表元素名称中的结尾数字对列表进行排序?

How do I order list by ending number in name of list element?

我有以下代码,它给出了几个 txt 文件的列表,我如何根据最后一个数字(1770、1780、1790、1800、700、710)重新排序列表,以便列表顺序现在按升序或降序排列 (700, 710, 1770, 1780, 1790, 1800)

> file_list <- list.files(path=folder, pattern="*.txt") 

> file_list

输出:

 [78] "172010_001_122C_2.0_1770.txt"    
 [79] "172010_001_122C_2.0_1780.txt"    
 [80] "172010_001_122C_2.0_1790.txt"    
 [81] "172010_001_122C_2.0_1800.txt"    
 [82] "172010_001_122C_2.0_700.txt"     
 [83] "172010_001_122C_2.0_710.txt"     
 [84] "172010_001_122C_2.0_720.txt" 

有几种方法可以做到这一点。我更喜欢使用可以用 base R 处理的正则表达式。下面是一个使用 stringr

的示例
library(stringr)
## Create some example data
file_list <- c("172010_001_122C_2.0_1770.txt", 
               "172010_001_122C_2.0_1780.txt", 
               "172010_001_122C_2.0_700.txt")

我们在 .txt 之前提取字符串的最后一部分。请注意,值的长度不同——否则我们可以直接使用 substr 函数并提取相关字符。在这里,我们提取 .txt 之前的所有数字。这些在字符矩阵中返回,第二列包含我们之后的内容

result <- as.numeric(str_match(file_list, "(\d+)\.txt")[,2])
result
[1] 1770 1780  700

然后你可以对文件名进行排序

file_list[order(result)]
[1] "172010_001_122C_2.0_700.txt"  "172010_001_122C_2.0_1770.txt"
[3] "172010_001_122C_2.0_1780.txt"

这是一个使用 gsub

的基于 R 的解决方案
file_list <- c("172010_001_122C_2.0_1770.txt", 
               "172010_001_122C_2.0_1780.txt", 
               "172010_001_122C_2.0_700.txt")

file_list[order(as.numeric(gsub(".+_(\d+)\.txt$", "\1", file_list)))]
# [1] "172010_001_122C_2.0_700.txt"  "172010_001_122C_2.0_1770.txt"
# [3] "172010_001_122C_2.0_1780.txt"

说明:我们匹配表达式 .+_ 后跟数字 \d+ 后跟 .txt,并按递增的数字排序。