如何按列表元素名称中的结尾数字对列表进行排序?
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
,并按递增的数字排序。
我有以下代码,它给出了几个 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
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
,并按递增的数字排序。