fread:将某行读为隐式排序因子

时间:2014-09-15 17:30:16

标签: r data.table fread

我是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()函数的文档,其中包含一个选项ordered,它隐含地按顺序读取因子级别。但是,我不知道一种指定染色体列应该是有序因子的方法,因为唯一相关的选项是stringsAsFactors(这会将所有字符串转换为因子,考虑到因素非常低效)其他列中的非唯一字符串的数量)和colClasses,其中我不知道将列转换为隐式排序因子的任何方法。

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

注意:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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