You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取转录本最后外显子并得到可操作的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.22 16:15:00