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`.