1. 当GEO平台注释文件缺失时该怎么办遇到GEO数据库中GPL平台注释文件缺失的情况相信不少做生信分析的小伙伴都曾为此头疼过。我刚开始接触GEO数据分析时也经常被这个问题困扰直到后来摸索出一套系统化的解决方案。今天就把这些实战经验分享给大家手把手教你应对各种注释文件缺失的情况。首先别慌遇到GPL平台没有基因注释文件时我们可以按照以下优先级来排查检查补充文件是最先要做的事情。很多情况下作者会在数据集补充文件中上传已经注释好的表达矩阵。比如GSE164011这个数据集虽然GPL21697、GPL24676和GPL29487三个平台注释都是空的但作者在补充文件中提供了转换完ID的矩阵直接下载使用即可。如果补充文件里没有尝试搜索引擎查找。用GPL编号gene或GSE编号symbol这样的关键词组合在Google或GitHub上搜索经常能找到其他研究者分享的注释文件。我遇到过好几次这种情况特别是一些热门平台网上通常都有现成的解决方案。对于比较新的平台访问官网查询是个不错的选择。比如Agilent的平台就去Agilent官网Illumina的平台就去Illumina官网查找。虽然这个方法比较耗时但成功率很高。记得有一次我花了半小时在官网找到了一个刚发布不久的芯片注释文件那种成就感至今难忘。2. 实用R包推荐与使用技巧当上述方法都行不通时就该我们的R包大显身手了。这里重点推荐几个我常用的R包org.Hs.eg.db是最基础的注释包支持多种ID类型的转换。比如处理RefSeq ID时可以这样操作library(org.Hs.eg.db) ids - select(org.Hs.eg.db, keysdata$ID, columnsSYMBOL, keytypeREFSEQ)这个包几乎能处理所有常见的人类基因ID转换问题是我使用频率最高的工具。idmap1和idmap2这两个包是我最近发现的宝藏。idmap1整合了Bioconductor中的37个芯片平台注释信息而idmap2更强大包含了122个GPL平台的注释数据。安装方法如下library(devtools) install_github(jmzeng1314/idmap1) install_github(jmzeng1314/idmap2)使用起来非常简单library(idmap2) ids - get_soft_IDs(GPL570) # 获取HG-U133_Plus_2芯片的注释clusterProfiler也是个不错的选择特别适合ENTREZID到SYMBOL的转换library(clusterProfiler) gene_symbol - bitr(exp_ENTREZ$ENTREZID, fromTypeENTREZID, toTypeSYMBOL, OrgDborg.Hs.eg.db)3. 常见问题与解决方案在实际操作中我遇到过各种各样的问题这里分享几个典型案例案例1注释文件中隐藏的Symbol信息GSE212067这个数据集乍看没有Symbol注释但仔细检查发现gene_assignment列里其实包含了Symbol信息只是需要用正则表达式提取library(stringr) df$ann - str_extract(df$gene_assignment, (?// ).?(? //))案例2大小写问题GSE242881是小鼠数据Symbol列中的基因名都是小写的容易被忽略。处理这类数据时要特别注意大小写问题。案例3多探针对应同一基因这是最常见的问题之一。我的解决方案是取平均值exp_unique - avereps(exp_symbol[, -ncol(exp_symbol)], IDexp_symbol$SYMBOL)4. 完整代码示例与实战演练下面通过一个完整案例演示如何处理注释文件缺失的GEO数据。以GSE69063为例这个数据集的注释文件GPL19983只有探针ID和ENTREZID# 加载必要的包 library(GEOquery) library(limma) library(org.Hs.eg.db) # 下载数据集 gset - getGEO(GSE69063, destdir., AnnotGPLT, getGPLT, GSEMatrixT) # 获取表达矩阵和注释信息 exp - exprs(gset[[1]]) gpl - fData(gset[[1]])[, c(ID, ENTREZ_GENE_ID)] # 探针ID到ENTREZID gpl$ENTREZID - gpl$ENTREZ_GENE_ID exp - as.data.frame(exp) exp$ID - rownames(exp) exp_ENTREZ - merge(exp, gpl, byID) exp_ENTREZ - na.omit(exp_ENTREZ) # ENTREZID到Symbol gene_symbol - bitr(exp_ENTREZ$ENTREZID, fromTypeENTREZID, toTypeSYMBOL, OrgDborg.Hs.eg.db) exp_symbol - merge(exp_ENTREZ, gene_symbol, byENTREZID) # 处理重复基因 exp_unique - avereps(exp_symbol[, -c(1, ncol(exp_symbol))], IDexp_symbol$SYMBOL) write.csv(exp_unique, GSE69063_exp_unique.csv)这套流程我用了不下50次几乎适用于所有常见的GEO数据集。刚开始可能会觉得步骤有点多但熟悉后处理一个数据集也就10分钟左右。最后再分享一个小技巧在处理新数据集时我通常会先用head()和str()函数快速浏览数据结构这能帮助我快速判断需要提取哪些列以及可能存在哪些坑。比如有些数据集会把Symbol信息藏在不起眼的列里或者使用非标准的列名提前检查能省去很多麻烦。