0

我对R相当陌生,最近一直在使用 data.table 进行一个涉及大型数据集(特别是基因组数据)操作的项目。其中一列是染色体编号/名称,格式为“chr_”,其中 _ 为 1-22、X 或 Y。由于数据按染色体位置排序,因此这是我的数据的自然主键. 但是,将此设置为键会产生不需要的结果,即按字典顺序而不是一般数字顺序排序(即顺序是 1,10,11,...,19,2,20,...,X,Y 而不是大于 1,2,...,9,10,11,...,19,20,...,X,Y)。我查看了 factor() 函数的文档,其中包括一个 option ordered,它按顺序隐式读取因子级别。但是,我不知道指定染色体列应该是有序因子,因为唯一相关的选项是 stringsAsFactors(这会将所有字符串转换为因子,考虑到其他列中非唯一字符串的数量,这将非常低效)和 colClasses,我不知道任何转换方法列隐式排序的因素。

有谁知道 fread() 的隐式排序因子的实现,或者 data.table 将字符列转换为有序因子的任何有效方法?

笔记:

我主要在寻找最有效的实现,最好是在读取过程中直接将列转换为有序因子的实现。

4

2 回答 2

0

只需直接指定因子的水平即可。

d <- data.frame(chr=sample(c(1:22, "X", "Y"), 100, replace=T))
d$chr <- factor(d$chr, levels=c(1:22, "X", "Y"))
ordered(d$chr)

输出是

[1] 8  8  4  18 6  4  8  17 14 17 8  Y  16 3  15 22 9  16 11 17 12 17 12 11 18
[26] 16 X  10 15 7  18 6  Y  Y  21 13 21 2  2  Y  21 8  4  21 X  6  12 19 14 10
[51] 7  15 10 19 4  21 20 14 18 4  4  11 7  14 17 17 2  9  1  11 16 17 19 14 1 
[76] 19 12 18 18 13 10 17 21 18 17 Y  Y  4  21 19 17 5  Y  X  7  8  18 22 13 5 
24 Levels: 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < 11 < 12 < 13 < ... < Y
于 2014-09-15T17:46:20.100 回答
0

从描述看来,这可能会有所帮助

 set.seed(42)
 dat <- data.frame(chrN= sample(c(paste0("chr", c(1:22, "X", "Y"))), 24, replace=FALSE),    value=rnorm(24), stringsAsFactors=FALSE)
 library(gtools)
 dat[mixedorder(dat[,1]),]

 ordered(dat[,1], levels=mixedsort(unique(dat[,1])))
 #[1] chr22 chrY  chr7  chr18 chr13 chr10 chr14 chr3  chr11 chr16 chrX  chr19
#[13] chr12 chr17 chr5  chr9  chr8  chr1  chr15 chr6  chr4  chr21 chr2  chr20
#24 Levels: chr1 < chr2 < chr3 < chr4 < chr5 < chr6 < chr7 < chr8 < ... < chrY
于 2014-09-15T17:39:08.460 回答