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