首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fread:将某些行读入隐式有序因子

fread:将某些行读入隐式有序因子
EN

Stack Overflow用户
提问于 2014-09-15 17:30:16
回答 2查看 801关注 0票数 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()函数的文档,它包括一个选项ordered,该选项按顺序隐式读取因子级别。但是,我不知道有什么方法可以指定染色体列应该是一个有序的因子,因为唯一相关的选项是stringsAsFactors (这将把所有字符串转换成因子,考虑到其他列中的非唯一字符串的数量,这将是非常低的)和colClasses,我不知道任何将列转换为隐式有序因子的方法。

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

注意:

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

EN

回答 2

Stack Overflow用户

发布于 2014-09-15 17:39:08

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

代码语言:javascript
复制
 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
票数 0
EN

Stack Overflow用户

发布于 2014-09-15 17:46:20

只需直接指定因子的级别即可。

代码语言:javascript
复制
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)

输出是

代码语言:javascript
复制
[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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25853575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档