【生信技能树】GEO数据库挖掘

P5 4 ID转换技巧大全

【方法1】本章接导入,利用read.table函数导入gz文件后是一个data.frame

# 根据情况设置分隔符啥的
  a=read.table('GSE42872_series_matrix.txt.gz', sep = '\t',quote = "", fill = T,
               comment.char = "!", header = T)
  # 获取第一列的名字
  rownames(a)=a[,1]
  # 去掉第一列,避免重复
  a=a[,-1]
  class(a)
  str(a)

【方法2】本章利用getGEO方式导入,获取其表达矩阵。

如果使用getGEO获取的是一个对象,要取其中的[[1]]

这个GSE的文件包含了很多个平台的测序数据,需要str看一下他内部有几个对象,即有哪几个平台的数据在,然后获取gset[[1]],这个相关信息也可以在这个GSE的样本界面去寻找。

找到这个对象,然后再对其进行expr转化为matrix

if(!file.exists(f)){
  gset <- getGEO('GSE42872', destdir=".",
                 AnnotGPL = F,     ## 注释文件
                 getGPL = F)       ## 平台文件
  save(gset,file=f)   ## 保存到本地,并且被直接命名为gset
}
b=gset[[1]]
a1=exprs(b) # 获得matrix

我们可以将代码打包成一个function:

downGSE <- function(studyID="GSE42872",destdir="."){
  library(GEOquery)

      gset <- getGEO(studyID, destdir=".",
                     AnnotGPL = F,     ## 注释文件
                     getGPL = F)       ## 平台文件
    # 对gset处理
    exprSet=exprs(gset[[1]]) # 获取表达矩阵
    pdata=pData(gset[[1]]) # 获取表达对应信息
    class(gset)
    length(gset)
    str(gset)
    write.csv(exprSet,paste0(studyID,"_exprSet.csv")) # 工作环境中导出表达矩阵
    write.csv(pdata,paste0(studyID,"_metadata.csv")) # 工作环境中导出相关信息
    reture(gset)
  }
# 该种function可以直接获取标本信息(pdata)以及修正过的表达矩阵
downGSE('GSE42872')

导入后需注意格式,必要时调整。

以下为获取包以及探针的内容,可在另一篇笔记中获取,等有空再补充学习完整其他方法。

# 然后看一下这个GSE数据所对应的平台的ID文件
library(hugene10sttranscriptcluster.db)
# 此时回到官网去搜这个包的GPL平台,进而去搜这个ID注释的包
ls("package:hugene10sttranscriptcluster.db") 

ids=toTable(hugene10sttranscriptclusterSYMBOL)
# 用exprSet来后续计算,方便一些。
exprSet <- as.matrix(GSE42872_exprSet)
# 注释文件命名为pdata
pdata <- read_csv("GSE42872_metadata.csv")
save(ids,exprSet,GSE42872_metadata,file = 'input.Rdata')
length(unique(ids$symbol))
tail(sort(table(ids$symbol)))
table(sort(table(ids$symbol)))

plot(table(sort(table(ids$symbol))))
# ids就是探针对应基因的list,ids中是基因的symble
# 由于可能每个symble也可能对应多个probe,即很多个symble后面都是相同的基因
# 因此要选取同一个symble(基因)对应多个probe中的处理过的量
# 后续在笔记中也可见。等时机成熟补充完全。

需要观察一下数据,有的symbol对应多个probe,因此需要洗一下。

Step-1:先选取这个包里有的probe的基因

# 清洗exprset中与id有交集的基因,%in%就是all in得意思
table(rownames(exprSet) %in% ids$probe_id)
dim(exprSet)
# 选取all in的基因
exprSet=exprSet[rownames(exprSet) %in% ids$probe_id,]
dim(exprSet)

Step-2:按exprset的顺序排列探针

# 更改id顺序,从ids中提取表达矩阵的每一个,这样就一致了
ids=ids[match(rownames(exprSet),ids$probe_id),]
# 注意ids和exprset的行数是否相同
head(ids)
# 查看一下
exprSet[1:5,1:5]

举个例子:用IGKC这个有很多probe的symbol来说明后续函数的运行逻辑

# 通过id的symbol对表达矩阵分类
# 用一个10个探针对应一个基因的情况来举例子
# IGKC基因:这里要在上述取相同基因之前学习
if(F){
  x=exprSet[ids[,2]=='IGKC',] # exprset的行==ids的列
  rownames(x)
  rowMeans(x) #  每行取平均值,因为这里是挑probe所以要看平均的表达量即可。
  which.max(rowMeans(x)) # 看看最大的在哪里
  rownames(x)
}

正式的代码:

# 获取新探针列表
  # by函数:把exprset数据集按照ids的symbol分类
  # 然后每个新数据集,做function:取这里的所有行平均值的最大值那个对应的rownames
  # 这里就可以根据需求自行调节
  tmp = by(exprSet,
           ids$symbol,
           function(x) rownames(x)[which.max(rowMeans(x))] )
  # 提取这个列表,教做probes
  probes = as.character(tmp)
  dim(exprSet)
  exprSet=exprSet[rownames(exprSet) %in% probes ,]
  dim(exprSet)
  
  rownames(exprSet)=ids[match(rownames(exprSet),ids$probe_id),2]
  exprSet[1:5,1:5]
  
  # 写一个函数包含上述的内容
  # 这里exprset和ids必须一一对应。
  if(F){
    cleaning <- function(exprSet,ids){
      tmp = by(exprSet,
               ids$symbol,
               function(x) rownames(x)[which.max(rowMeans(x))] )
    # 提取这个列表,教做probes
    probes = as.character(tmp)
    print(dim(exprSet))
    exprSet=exprSet[rownames(exprSet) %in% probes ,]
    print(dim(exprSet))
    return(exprSet)
    }
  }

在文中可以做一个function进行封存,但是需注意的是两个列表必须数量相等且名字一致。

这里by函数,以及后续再取个交集(以表达矩阵为核心)不展开。

这样就可以获得清洗后即只有一个最合适的表达量probe的symbol的矩阵,并且对应好了相应的symbol且只有1个。

【如果没有相应的包】

无法获取ids,需回到GPL平台获取,要看这个GSE的GPL信息有没有,可以直接下载,比较大。然后再通过getGEO,看看这个gpl内容,再选取其中有用的列,作为后续的ids进行分析。

# 如果无法找到对应的包
if(F){
  library(Biobase)
  library(GEOquery)
  # download GPL files,put in the directory and load
  # 这里的GPL应该是看GSE的矩阵对应的平台号码是谁,底下的表格里有
  gpl <- getGEO('GPL6480', destdir = ".")
  colnames(Table(gpl))
  # 选择所需的column,就是要探针和基因对应的关系,就可以作为ids进行后续分析
  head(Table(gpl)[,c()])
  write.csv(Table(gpl)[,c()],"name")
}