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

4

我的文件如下:

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")

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

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

但是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"

如何对具有字母数字名称的对象进行排序?

3个回答

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"))

在我的系统上,这样做会得到:

> 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"
函数gtools::mixedsort通常可以按照您想要的方式进行排序:字符串中的数字序列会被视为数字进行排序。不过,您的示例有一点小问题,因为mixedsort假设.是数字的一部分,因此将.200.看作潜在的数字,但实际上无法将其作为数字进行排序。由于您的示例中没有实际的小数点,所以可以解决这个问题。
files <- files[mixedorder(gsub("\\.", " ", files))]

现在,so文件已经按照以下顺序排序:

> 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"

2
这样做可以吗?
files <- c("Gen.Var_CT.BP.50.txt", "Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt",    "Gen.Var_GP.BP.50.txt", "Gen.Var_GP.BP.200.txt", "Gen.Var_GP.BP.500.txt"){
for (i in 1:length(files)) {
  b <- read.table(files[i])
  barplot(table(b$V1), main=files[i])

1
当有很多(>100)“c”文件时,我应该如何自动化它们? - pogibas
哦,听起来好像你只有6个文件。 - Jeff Allen

1

看起来你想按特定组件以特定顺序对文件名进行排序。

因此,我建议使用类似以下的方法将文件名分解为其组件:

filesmat=matrix(unlist(strsplit(files,split='\\.')),byrow=T,ncol=4)

然后提取您想要排序的列。

numbercomponent=as.numeric(filesmat[,3])

varname=filesmat[,1]

然后使用类似于以下命令重新排序文件名:

files=files[order(varname,numbercomponent)]

然后按照你想要的方式进行绘图即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接