我是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将字符列转换为有序因子的任何有效方法?
我主要寻找最有效的实现,最好是在读取过程中直接将列转换为有序因子。
答案 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