如何按用户定义的顺序对数据帧进行排序(例如,非字母顺序) [英] How to sort a data frame by user-defined (e.g. non-alphabetic order)

查看:115
本文介绍了如何按用户定义的顺序对数据帧进行排序(例如,非字母顺序)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出一个数据帧dna

> dna
chrom   start
chr2    39482
chr1    203918
chr1    198282
chrX    7839028
chr17   3874

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

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

但是,我希望能够按以下方式排序$chrom(为此处示例简化):

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")

我不允许重命名内容,例如将chr1重命名为chr01.

I am not allowed to rename stuff, for example chr1 to chr01.

推荐答案

您需要在factor中指定levels,然后将order用于索引编制:

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  

或者您可以使用此:

> 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

或使用此:

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

这篇关于如何按用户定义的顺序对数据帧进行排序(例如,非字母顺序)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆