代码之家  ›  专栏  ›  技术社区  ›  MAPK

如何根据分隔符前的值对r中的向量元素排序

  •  1
  • MAPK  · 技术社区  · 6 年前

    我有一个向量叫做 myvec . 我想根据之前的数字对值进行排序 - . 有什么建议吗?

    myvec <- c("2-1_16S_S217_R1_001.fastq", "2-2_16S_S226_R1_001.fastq", "3-1_16S_S234_R1_001.fastq", 
    "3-2_16S_S242_R1_001.fastq", "11-1_16S_S199_R1_001.fastq", "1-1_16S_S197_R1_001.fastq", 
    "11-2_16S_S209_R1_001.fastq", "1-2_16S_S207_R1_001.fastq")
    

    而且,当我这样做的时候 sort (myvec) 我得到:

    [1] "1-1_16S_S197_R1_001.fastq"  "1-2_16S_S207_R1_001.fastq"  "11-1_16S_S199_R1_001.fastq" "11-2_16S_S209_R1_001.fastq"
    [5] "2-1_16S_S217_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq"  "3-1_16S_S234_R1_001.fastq"  "3-2_16S_S242_R1_001.fastq"
    

    也试过了

    require('gtools')
    mixedsort(myvec)
    

    它给出:

    [1] "1-2_16S_S207_R1_001.fastq"  "1-1_16S_S197_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq"  "2-1_16S_S217_R1_001.fastq" 
    [5] "3-2_16S_S242_R1_001.fastq"  "3-1_16S_S234_R1_001.fastq"  "11-2_16S_S209_R1_001.fastq" "11-1_16S_S199_R1_001.fastq"
    

    我想要的结果:

    1-1_16S_S197_R1_001.fastq
    1-2_16S_S207_R1_001.fastq
    2-1_16S_S217_R1_001.fastq
    2-2_16S_S226_R1_001.fastq
    3-1_16S_S234_R1_001.fastq
    3-2_16S_S242_R1_001.fastq
    11-1_16S_S199_R1_001.fastq
    11-1_16S_S199_R1_001.fastq
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    一种选择是用 parse_number , order 关于它

    myvec[order(readr::parse_number(myvec))]
    #[1] "1-1_16S_S197_R1_001.fastq"  "1-2_16S_S207_R1_001.fastq"  
    #[3] "2-1_16S_S217_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq" 
    #[5] "3-1_16S_S234_R1_001.fastq"  "3-2_16S_S242_R1_001.fastq"
    #[7] "11-1_16S_S199_R1_001.fastq" "11-2_16S_S209_R1_001.fastq"
    

    或者我们要根据第一个字符之前的字母数字字符进行排序 - ,然后用提取子字符串 str_extract (从 stringr )、使用 mixedorder (从 gtools )对矢量排序

    library(gtools)
    library(stringr)
    myvec[mixedorder(str_extract(myvec, "^[^-]+"))]
    
        2
  •  2
  •   Julius Vainora    6 年前

    我们也可以使用 str_sort stringr

    stringr:::str_sort(myvec, numeric = TRUE)
    # [1] "1-1_16S_S197_R1_001.fastq" 
    # [2] "1-2_16S_S207_R1_001.fastq" 
    # [3] "2-1_16S_S217_R1_001.fastq" 
    # [4] "2-2_16S_S226_R1_001.fastq" 
    # [5] "3-1_16S_S234_R1_001.fastq" 
    # [6] "3-2_16S_S242_R1_001.fastq" 
    # [7] "11-1_16S_S199_R1_001.fastq"
    # [8] "11-2_16S_S209_R1_001.fastq"
    
        3
  •  1
  •   Jilber Urbina    6 年前
    < PRE> > myvec[order(as.numeric(sub("(^\\d+).*", "\\1", myvec)))] [1] "1-1_16S_S197_R1_001.fastq" [2] "1-2_16S_S207_R1_001.fastq" [3] "2-1_16S_S217_R1_001.fastq" [4] "2-2_16S_S226_R1_001.fastq" [5] "3-1_16S_S234_R1_001.fastq" [6] "3-2_16S_S242_R1_001.fastq" [7] "11-1_16S_S199_R1_001.fastq" [8] "11-2_16S_S209_R1_001.fastq"