使用数字和字母(字母数字)名称对文件/对象进行排序

PoG*_*bas 4 sorting r alphanumeric

我的文件是:

CT.BP.50.txt
CT.BP.200.txt
CT.BP.500.txt 
GP.BP.50.txt
GP.BP.200.txt 
GP.BP.500.txt 

files <- c("CT.BP.50.txt", "CT.BP.200.txt", "CT.BP.500.txt", "GP.BP.50.txt", "GP.BP.200.txt", "GP.BP.500.txt")
Run Code Online (Sandbox Code Playgroud)

我想对它们执行特定操作,我可以这样做:

for (i in 1:length(files)) {
    foo <- read.table(files[i])
    barplot(table(foo$V1), main = files[i])
}
Run Code Online (Sandbox Code Playgroud)

但是R按照这个顺序绘制它们:

"CT.BP.200.txt""CT.BP.500.txt""CT.BP.50.txt""GP.BP.200.txt""GP.BP.500.txt""GP.BP. 50.txt"

我希望它们按排序顺序绘制:

"CT.BP.50.txt""CT.BP.200.txt""CT.BP.500.txt""GP.BP.50.txt""GP.BP.200.txt""GP.BP. 500.txt"

如何使用字母数字名称对对象进行排序?

Bri*_*ggs 11

问题是以list.files()标准(词法)排序顺序返回文件名,并且数字是逐个位置而不是数字的一部分进行比较.

files <- sort(c("Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt", 
                "Gen.Var_CT.BP.50.txt", "Gen.Var_GP.BP.200.txt",
                "Gen.Var_GP.BP.500.txt", "Gen.Var_GP.BP.50.txt"))
Run Code Online (Sandbox Code Playgroud)

在我的系统上,这给出了:

> files
[1] "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.50.txt"  "Gen.Var_CT.BP.500.txt"
[4] "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.50.txt"  "Gen.Var_GP.BP.500.txt"
Run Code Online (Sandbox Code Playgroud)

该函数gtools::mixedsort将(通常)按您希望的方式排序:字符串中的一系列数字将被视为用于排序目的的数字.但是,您的示例有一点障碍,因为mixedsort假设.是数字的一部分,因此.200.视为潜在数字,实际上不能将其排序为数字.由于您的示例中没有实际的小数点,您可以解决这个问题.

files <- files[mixedorder(gsub("\\.", " ", files))]
Run Code Online (Sandbox Code Playgroud)

所以文件现在排序为:

> files
[1] "Gen.Var_CT.BP.50.txt"  "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.500.txt"
[4] "Gen.Var_GP.BP.50.txt"  "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.500.txt"
Run Code Online (Sandbox Code Playgroud)