### 加载r包
library(GEOquery)
library(dplyr)
library(tidyverse)
#########################################################################################
##下载数据 getGPL = F 这个代表不下载平台注释文件,因为有时候网络不稳定。所以我们会在网页中下载GPL文件,然后读取。
#对一个文章的数据进行分析 一定要得到两个文件 一个是表达矩阵 一个是gpl文件 由于无法通过网站的形式下载gpl文件 介绍以下两种方法
#方法一 参数里面改为getGPL =T 直接下载了注释文件
#为什么要这样下呢,因为这个GSE149507的GPL文件无法网页下载
gset = getGEO('GSE149507', destdir=".",getGPL =T) #即相比getGPL =F 中在featureData下的data中多了注释信息 但是有一些不好下 因为很大
gpl=gset[["GSE149507_series_matrix.txt.gz"]]@featureData@data #观察一下注释文件 发现无symbol信息 只有ID与对应ENTREZ_GENE_ID的信息
gset=gset[[1]]
exprSet=exprs(gset)
#这样就获得了两个文件 一个是表达矩阵 一个是gpl信息 可以准备后面的ID与symbol的转换了
#方法二 将网页版的soft文件下载
soft=getGEO(filename ="GSE149507_family.soft/GSE149507_family.soft") #要解压
gpl=soft@gpls[["GPL23270"]]@dataTable@table
gset=gset[[1]]
pdata=pData(gset) #专门用于提取临床信息的function
exprSet=exprs(gset)
#这样就获得了两个文件 一个是表达矩阵 一个是gpl信息 可以准备后面的ID与symbol的转换了
#由于这里涉及的是ENTREZ_GENE_ID与id 然后再转换为symbol
##BiocManager::install("org.Hs.eg.db")
library(org.Hs.eg.db)
###查看一下有哪些基因ID
keytypes(org.Hs.eg.db)
#keytypes(org.Mm.eg.db)
x1=gpl$ENTREZ_GENE_ID
x1=as.character(x1) #后面要求是字符型的向量 keys为转换对象
x2=AnnotationDbi::select(org.Hs.eg.db, keys=x1, columns=c("ENTREZID","SYMBOL"), keytype="ENTREZID") #首先是数据库 keys为转换对象 columns为将对象转化为谁 keytype=为转化对象本身的类型
#colnums将对象转化 假如要转换出"ENSEMBL"这种容易重复的对象来说 会导致后面merge容易报错
gpl=gpl[,c(1,2)] #去掉gpl中多余的信息
gpl$gene=x2$SYMBOL #添加symbol在gpl数据框中,因为向量是有方向的 会按照symbol的方向添加 而symbol的方向是根据id号来排序的
###平台和表达矩阵合并
colnames(gpl)
exp=as.data.frame(exprSet)
exp.pl=merge(gpl,exp,by.x=1,by.y=0) #gpl的第一列与exp的第0列进行merge
####将gene symbol名变为行名
#首先要对gene.symbol这一列进行处理
exp.pl.1=distinct(exp.pl,gene,.keep_all = T) #首先删除重复的基因名 因为多个探针对应同一个基因,这时候行名已经从22283变成了13238 distinct函数(对象, 特定列)
exp.pl.2=na.omit(exp.pl.1) #删除缺失值
rownames(exp.pl.2)=exp.pl.2$gene
View(exp.pl.2)
###去除第一列和第二列
exp.pl.3=exp.pl.2[,-c(1:3)] #这样就整理好了表达矩阵 标准的表达矩阵为exp.pl.3