r - 根据多个正则表达式子字符串对变量进行排序

标签 r regex sorting substring

我试图在 R 中订购一个变量,它是一个文件名列表,其中包含我想要订购的三个子字符串。文件名的格式如下:

MAF001.incMHC.zPGS.S1
MAF002.incMHC.zPGS.S1
MAF003.incMHC.zPGS.S1
MAF001.incMHC.zPGS.S2
MAF002.incMHC.zPGS.S2
MAF003.incMHC.zPGS.S2
MAF001.noMHC_incRS148.zPGS.S1
MAF002.noMHC_incRS148.zPGS.S1
MAF003.noMHC_incRS148.zPGS.S1
MAF001.noMHC_incRS148.zPGS.S2
MAF002.noMHC_incRS148.zPGS.S2
MAF003.noMHC_incRS148.zPGS.S2
MAF001.noMHC.zPGS.S1
MAF002.noMHC.zPGS.S1
MAF003.noMHC.zPGS.S1
MAF001.noMHC.zPGS.S2
MAF002.noMHC.zPGS.S2
MAF003.noMHC.zPGS.S2

我想首先在 MAF 子串上对这个列表进行排序,然后是 MHC 子串,然后是 S 子串,这样的顺序是:
MAF001.incMHC.zPGS.S1
MAF001.noMHC_incRS148.zPGS.S1
MAF001.noMHC.zPGS.S1
MAF001.incMHC.zPGS.S2
MAF001.noMHC_incRS148.zPGS.S2
MAF001.noMHC.zPGS.S2
MAF002.incMHC.zPGS.S1
MAF002.noMHC_incRS148.zPGS.S1
MAF002.noMHC.zPGS.S1
MAF002.incMHC.zPGS.S2
MAF002.noMHC_incRS148.zPGS.S2
MAF002.noMHC.zPGS.S2
MAF003.incMHC.zPGS.S1
MAF003.noMHC_incRS148.zPGS.S1
MAF003.noMHC.zPGS.S1
MAF003.incMHC.zPGS.S2
MAF003.noMHC_incRS148.zPGS.S2
MAF003.noMHC.zPGS.S2

在看到关于单个子字符串的这个问题的答案后,我玩了 gsub:
R Sort strings according to substring

但我不确定如何将这个想法扩展到字符串中的多个子字符串(混合字符和数字类)。

最佳答案

这是基础 R 中的单行:

bar <- foo[order(sapply(strsplit(foo, "\\."), function(x) paste(x[1], x[4])))]
head(data.frame(result = bar), 10)

                          result
1          MAF001.incMHC.zPGS.S1
2  MAF001.noMHC_incRS148.zPGS.S1
3           MAF001.noMHC.zPGS.S1
4          MAF001.incMHC.zPGS.S2
5  MAF001.noMHC_incRS148.zPGS.S2
6           MAF001.noMHC.zPGS.S2
7          MAF002.incMHC.zPGS.S1
8  MAF002.noMHC_incRS148.zPGS.S1
9           MAF002.noMHC.zPGS.S1
10         MAF002.incMHC.zPGS.S2

解释:
  • 通过 . 拆分字符串使用 strsplit :strsplit(foo, "\\.")
  • 提取并组合元素 1 和 4:paste(x[1], x[4])
  • 使用 order 获取所有组合的顺序
  • foo[] 获取相应的值


  • 数据 ( foo ):
    c("MAF001.incMHC.zPGS.S1", "MAF002.incMHC.zPGS.S1", "MAF003.incMHC.zPGS.S1", 
    "MAF001.incMHC.zPGS.S2", "MAF002.incMHC.zPGS.S2", "MAF003.incMHC.zPGS.S2", 
    "MAF001.noMHC_incRS148.zPGS.S1", "MAF002.noMHC_incRS148.zPGS.S1", 
    "MAF003.noMHC_incRS148.zPGS.S1", "MAF001.noMHC_incRS148.zPGS.S2", 
    "MAF002.noMHC_incRS148.zPGS.S2", "MAF003.noMHC_incRS148.zPGS.S2", 
    "MAF001.noMHC.zPGS.S1", "MAF002.noMHC.zPGS.S1", "MAF003.noMHC.zPGS.S1", 
    "MAF001.noMHC.zPGS.S2", "MAF002.noMHC.zPGS.S2", "MAF003.noMHC.zPGS.S2"
    )
    

    关于r - 根据多个正则表达式子字符串对变量进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49304142/

    相关文章:

    r - 没有不需要的列的内部连接 ​​data.table

    regex - 打印行中的第一个数字,后跟制表符和没有数字的行

    r - 将选择的列向右移动一列,并用行号 - 1 替换空白区域

    c++ - 正则表达式 : group for every found item (PCRE)

    Python根据大词表从字符串中提取词

    java - 在主类中调用/测试排序方法

    javascript - javascript中基于2个键值对的排序

    java - 似乎无法弄清楚在java中对对象数组进行排序

    r - 按相关实体对数据框进行分组

    r - 如何使用 R 中的 data.table 查找股票的月返回率?