如何通过列出list元素名称中的数字来命令列表?

时间:2017-10-28 22:31:28

标签: r list file reorderlist

我有以下代码,它给出了几个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" 

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。我更喜欢使用可以使用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"

答案 1 :(得分:0)

以下是基础R中使用gsub

的解决方案
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,并按增加数字排序。