How to sort a data frame by user-defined (e.g. non-alphabetic order)

function, r, sorting

Solution

You need to specify the `levels` in `factor` and then use `order` with indexing:

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  

or you can use this:

> 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

or use this:

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

Problem

Given a data frame `dna` ``` > dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 ``` The following code reorders `dna` by `$chrom` in alphabetical ascending order and by `$start` in numerical ascending order: ``` > dna <- dna[with(dna, order(chrom, start)), ] > dna chrom start chr1 198282 chr1 203918 chr17 3874 chr2 39482 chrX 7839028 ``` However, I would like to be able to have `$chrom` ordered as follows (simplified for the sake of my example here): ``` chrom_order <- c("chr1","chr2", "chr17", "chrX") ``` I am not allowed to rename stuff, for example `chr1` to `chr01`.

Original source

Related problems