如何提取转录本最后外显子并得到可操作的GRanges对象
报错原因
触发报错的核心是lapply()默认返回普通R列表,即使每个列表元素都是GRanges对象,普通list类型也不支持resize()、shift()这类专为GRanges/GRangesList设计的S4方法,对应的报错信息为:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘resize’ for signature ‘"list"’
现有列表对象的转换方法
根据后续操作需求,选择对应转换方式即可:
- 如果要将所有最后一个外显子作为独立区间做批量操作,直接将列表拼接为单个GRanges对象:
# 假设lapply输出的结果存储在last_exon_list变量中 last_exons_gr <- do.call(c, last_exon_list) # 转换完成后可正常调用所有GRanges支持的方法 last_exons_gr <- resize(last_exons_gr, width = 200, fix = "end")
- 如果需要保留「转录本-对应最后外显子」的分组映射关系,转换为GRangesList对象即可:
last_exons_grl <- GRangesList(last_exon_list)
注意:原代码未提前过滤外显子数≤1的转录本,转换前建议先筛除不符合要求的条目,避免结果混入单外显子转录本的区间。
直接提取最后一个外显子的最优实现
不需要将GRangesList转为数据框再按行索引遍历,exonsBy()返回的GRangesList本身支持高效子集操作,全程不会出现类型不匹配问题,代码更简洁、运行效率更高,参考代码如下:
library(GenomicFeatures) # 加载注释数据库 Gencode <- loadDb("gencode.v39.basic.annotation.sqlite") # 按转录本分组提取外显子,默认每个分组内的外显子按转录本5'->3'方向排序 Exons <- exonsBy(Gencode, by = "tx", use.names=TRUE) # 第一步:过滤保留外显子数>1的转录本 Exons_filtered <- Exons[elementNROWS(Exons) > 1] # 第二步:提取每个转录本的最后一个外显子,unlist后直接得到标准GRanges对象 last_exons <- unlist(tails(Exons_filtered, n = 1))
实现说明
tails()是GRangesList的内置方法,作用是提取每个分组的最后n个区间,返回结果保持GRangesList结构- 对提取结果直接调用
unlist()即可转为标准GRanges对象,后续可直接使用shift()、resize()等所有GRanges支持的操作 - 全程基于S4对象原生方法操作,不需要手动维护索引对应关系,不会出现索引错位、类型不匹配问题,处理大规模转录本数据时,运行速度远快于
lapply(1:nrow())的遍历写法。
内容的提问来源于stack exchange,提问作者Sky Scraper
相关产品推荐
相关产品推荐

