Bioconductor Biobase构建ExpressionSet annotatedDataFrameFrom报错
ExpressionSet构建报错分析与修正方案
报错触发原因
- 直接类匹配错误:
annotatedDataFrameFrom函数仅支持接收矩阵、数据框类作为入参,当前抛出的signature "character"报错,本质是函数接收到的入参为字符类型,和预设的方法签名不匹配。常见触发场景包括:- 用
read.csv()搭配sep="\t"读取制表符分隔文件时,分隔符识别错位,将整个文件读为单列字符向量,未生成预期的数据框结构 - 操作过程中误将字符向量覆盖原本的数据框对象,传入函数时触发类校验失败
- 用
- 方法选择偏差:
annotatedDataFrameFrom是Biobase早期版本的辅助构造函数,类校验逻辑严格,对普通数据框的兼容性较差,容易无触发缘由地抛出方法匹配错误。 - 维度匹配隐患:当前基因注释数据框共40223行,计数矩阵仅40220行,二者基因条目数量不一致,即使解决了类匹配报错,后续仍会触发维度不匹配错误。
调整步骤与修正代码
- 替换读文件工具:读取制表符分隔的文本文件时,使用
read.delim()替代read.csv(),从根源上避免分隔符参数失效导致的读入格式错误 - 增加维度对齐逻辑:
- 基因注释需完全匹配计数矩阵的行名顺序,剔除计数矩阵中不存在的多余基因条目
- 样本属性需完全匹配计数矩阵的列名顺序,剔除计数矩阵中不存在的多余样本条目
- 替换属性构造方法:使用Bioconductor原生推荐的
AnnotatedDataFrame()构造器生成属性对象,替代兼容性较差的annotatedDataFrameFrom(),从根源上避免类签名匹配问题。
修正后的完整可运行代码如下:
# 读入计数矩阵,关闭自动列名修正避免样本名错位 exprs <- as.matrix( read.delim( "counts.txt", sep = "\t", header = TRUE, row.names = 1, check.names = FALSE ) ) # 读入并整理基因注释 features <- read.delim("features.txt", sep = "\t", check.names = FALSE) rownames(features) <- features$ID features$ID <- NULL # 对齐基因和计数矩阵的行名,过滤多余基因 features <- features[rownames(exprs), ] # 读入并整理样本属性 phenotypes <- read.delim("phenotypes.txt", sep = "\t", check.names = FALSE) rownames(phenotypes) <- phenotypes$X1 phenotypes$X1 <- NULL # 对齐样本和计数矩阵的列名,过滤多余样本 phenotypes <- phenotypes[colnames(exprs), ] # 加载Biobase包 library(Biobase) # 构造ExpressionSet对象 eset <- ExpressionSet( assayData = exprs, phenoData = AnnotatedDataFrame(phenotypes), featureData = AnnotatedDataFrame(features) ) # 校验对象结构 eset
补充注意事项
- 读文件时设置
check.names = FALSE,避免R自动对列名中的特殊字符做转义修改,导致后续名称匹配失败 - 维度对齐步骤是ExpressionSet构建的强制要求:assayData的行数必须和featureData的行数一致,assayData的列数必须和phenoData的行数一致,名称必须一一对应
- 新版Biobase已逐步弱化
annotatedDataFrameFrom方法的使用,直接传入数据框到AnnotatedDataFrame()是官方推荐的标准构造流程。
内容的提问来源于stack exchange,提问作者Pedram Azimzadeh
相关产品推荐
相关产品推荐

