【问题标题】:Sort files/objects with numbers and letters (alphanumeric) names使用数字和字母(字母数字)名称对文件/对象进行排序
【发布时间】:2012-04-26 00:35:42
【问题描述】:

我的文件是:

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"

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

【问题讨论】:

    标签: r sorting alphanumeric


    【解决方案1】:

    问题在于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))]
    

    所以文件现在排序为:

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

      【讨论】:

      • 当文件数量更多(>100)时,我应该如何自动“c”文件
      • 哦。听起来你只有 6 个文件。
      【解决方案3】:

      您似乎想按特定顺序按文件名的特定组成部分进行排序。

      所以我会先将文件名分解成它的组成部分,例如:

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

      然后提取要排序的列。

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

      然后用类似的东西重新排列文件名

      files=files[order(varname,numbercomponent)]
      

      然后随心所欲地绘制。

      【讨论】:

        猜你喜欢
        • 2016-11-14
        • 2011-07-08
        • 2018-07-29
        • 2013-08-02
        • 2015-10-14
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多