我试图在 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, "\\.")
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/