在R中有时会需要通过数字大小对某些数据进行排序。
不过R默认是按照字符大小顺序进行排序,如常见的OTU名称:
OTU1,OTU2,OTU3,OTU10 ,OTU20...
会被默认排序为:
OTU1,OTU10,OTU2,OTU20,OTU3...
这在一些数据处理和画图过程非常不方便。
如果要按照数字排序为OTU1,OTU2,OTU10这种,可以有很多方法,本文举几种简单的例子:
先读进一个OTU表~
otu = read.table(file = "otu.txt",sep="\t",row.names = 1,header=T,check.names=F)
# 行名为OTU的名字
name = rownames(OTU)
library(gtools)
a = mixedorder(name)
otu2 = otu[a,]
library(stringr)
b = str_order(name, numeric = TRUE)
otu2 = otu[b,]
c = order(as.numeric(gsub("OTU","",name)))
otu2 = otu[c,]
d = order(as.numeric(sapply(strsplit(name,"Zotu"),"[",2)))
otu2 = otu[d,]
e = name[order(nchar(name),name)]
otu2 = otu[e,]
还有其他多种方法,不再赘述,Over~~~