如何按用户定义的数据框排序(例如非字母顺序)

bio*_*ard 6 sorting r function

给定一个数据框架 dna

> dna
chrom   start
chr2    39482
chr1    203918
chr1    198282
chrX    7839028
chr17   3874
Run Code Online (Sandbox Code Playgroud)

以下代码dna$chrom字母升序和$start数字升序重新排序:

> dna <- dna[with(dna, order(chrom, start)), ]
> dna
chrom   start
chr1    198282
chr1    203918
chr17   3874
chr2    39482
chrX    7839028
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够$chrom按如下方式进行排序(为了我的例子,这里简化了):

chrom_order <- c("chr1","chr2", "chr17", "chrX")
Run Code Online (Sandbox Code Playgroud)

我不允许重命名的东西,例如chr1chr01.

RUs*_*ser 10

您需要指定levelsin factor,然后使用order索引:

zz <- "chrom   start
chr2    39482
chr1    203918
chr1    198282
chrX    7839028
chr17   3874"
Data <- read.table(text=zz, header = TRUE)

library(Hmisc)
library(gdata)

Data$chrom  <- reorder.factor(Data$chrom , levels = c("chr1","chr2", "chr17", "chrX"))

Data[order(Data$chrom), ]
  chrom   start
2  chr1  203918
3  chr1  198282
1  chr2   39482
5 chr17    3874
4  chrX 7839028  
Run Code Online (Sandbox Code Playgroud)

或者你可以使用这个:

> Data$chrom  <- factor(chrom , levels = c("chr1","chr2", "chr17", "chrX"))
> Data[order(Data$chrom), ]
  chrom   start
2  chr1  203918
3  chr1  198282
1  chr2   39482
5 chr17    3874
4  chrX 7839028
Run Code Online (Sandbox Code Playgroud)

或使用此:

> Data$chrom <- reorder(Data$chrom, new.order=c("chr1","chr2", "chr17", "chrX"))
> Data[order(Data$chrom), ]
Run Code Online (Sandbox Code Playgroud)