GEO生信数据挖掘(三)芯片探针ID与基因名映射处理

检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例

目录

处理一个探针对应多个基因

1.删除该行

2.保留分割符号前面的第一个基因

处理多个探针对应一个基因

详细代码案例一删除法

[详细代码案例二 多个基因名时保留第一个基因名](#详细代码案例二 多个基因名时保留第一个基因名)

小结

更新版本的代码全文


上节我们下载了基因芯片平台文件并注释,我们发现存在一个芯片探针ID匹配到多个基因的情况,本节来介绍处理方案。

处理一个探针对应多个基因

我们通过简单检索发现两种方法:1.删除操作 2.保留分割符号前面的第一个基因

1.删除该行

#处理一个探针对应多个基因
#方案一:【删除该行】

explan_final <- data.frame(explan_final[-grep("///",explan_final$"Gene.Symbol"),]) 

#去一对多,grep是包含的意思,-就是不包含

2.保留分割符号前面的第一个基因

#方案二:【保留第一个基因名】
ids = platform_file_set #探针列名和基因名两列
library(tidyverse)
test_function <- apply(ids,
               1,
               function(x){
                 paste(x[1],
                       str_split(x[2],'///',simplify=T),
                       sep = "...")
               })
x = tibble(unlist(test_function))

colnames(x) <- "ttt" 
ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
dim(ids) #探针列名和基因名两列

显然,第一个发现非常简单,在使用merge函数匹配时,会剔除更多的基因。第二个方法,会保留更多基因。

处理多个探针对应一个基因

表达矩阵中还有一个问题,如下图所示,很多探针指向同一个基因。

#把重复的Symbol 取每个基因所有探针的平均值或最大值作为基因的表达量

matrix <- aggregate(.~Gene.Symbol, matrix, mean) ##把重复的Symbol取平均值

matrix <- aggregate(.~Gene.Symbol, matrix, max) ##把重复的Symbol取最大值

详细代码案例一删除法

# 安装并加载GEOquery包
library(GEOquery)

# 指定GEO数据集的ID
gse_id <- "GSE1297"

# 使用getGEO函数获取数据集的基础信息
gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!

# 提取基因表达矩阵
expression_data <- exprs(gse_info[[1]])


#查看平台文件列名
colnames(annotation)


#打印项目文件列表
dir() 

# 读取芯片平台文件txt
platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")

#查看平台文件列名
colnames(platform_file)

# 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
#probe_names <- platform_file$ID
#gene_symbols <- platform_file$Gene.Symbol
platform_file_set=platform_file[,c(1,11)]

#将Matrix格式表达矩阵转换为data.frame格式
exprSet <- data.frame(expression_data)


#给表达矩阵新增加一列ID
exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列

#矩阵表达文件和平台文件有相同列'ID',使用merge函数合并
express <- merge(x = exprSet, y = platform_file_set, by.x = "ID")

#删除探针ID列
express$ID =NULL

dim(express) 

exprSet = express
#查看多少个基因重复了
table(duplicated(exprSet$Gene.Symbol))


#处理重复基因,计算行平均值方案1
#rowMeans = apply(exprSet[,c(1:12)],1,function(x) mean(as.numeric(x), na.rm = T))####计算行平均值

#处理重复基因,计算行平均值方案2
#matrix <- aggregate(.~Gene.Symbol, matrix, mean)  ##把重复的Symbol取平均值
#row.names(matrix) <- matrix$Gene.Symbol  #把行名命名为SYMBOL

#处理重复基因,计算行平均值方案3
library(limma) #avereps 函数
exp_unique<-avereps(exp_symbol[,-c(32,ncol(exp_symbol))],ID=exp_symbol$Gene.Symbol)##把重复的Symbol取平均值

#排序
exprSet = exprSet[order(rowMeans, decreasing = T),] 
dim(exprSet)

#去掉重复基因
exprSet_2 = exprSet[!duplicated(exprSet[, dim(exprSet)[2]]),] 
dim(exprSet_2)

#去掉缺失值
exprSet_na = na.omit(exprSet_2)   
explan_final = exprSet_na[exprSet_na$Gene.Symbol != "",]
dim(explan_final)


#处理一个探针对应多个基因[删除法]
explan_final <- data.frame(explan_final[-grep("///",explan_final$"Gene.Symbol"),]) #去一对多,grep是包含的意思,-就是不包含
dim(explan_final)

rownames(explan_final) <- explan_final$Gene.Symbol
dim(explan_final)
explan_final <- explan_final[,c(1:31)]
# 此时explan_final为所需文件,行为基因,列为样本

> dim(explan_final)

[1] 12548 31

详细代码案例二 多个基因名时保留第一个基因名

# 安装并加载GEOquery包
library(GEOquery)

# 指定GEO数据集的ID
gse_id <- "GSE1297"

# 使用getGEO函数获取数据集的基础信息
gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!

# 提取基因表达矩阵
expression_data <- exprs(gse_info[[1]])

# 提取注释信息
annotation <- featureData(gse_info[[1]])


#查看平台文件列名
colnames(annotation)

#打印项目文件列表
dir() 

# 读取芯片平台文件txt
platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")

#查看平台文件列名
colnames(platform_file)

# 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
#probe_names <- platform_file$ID
#gene_symbols <- platform_file$Gene.Symbol
platform_file_set=platform_file[,c(1,11)]


#一个探针对应多个基因名,保留第一个基因名
ids = platform_file_set
library(tidyverse)
test_function <- apply(ids,
                       1,
                       function(x){
                         paste(x[1],
                               str_split(x[2],'///',simplify=T),
                               sep = "...")
                       })
x = tibble(unlist(test_function))

colnames(x) <- "ttt" 
ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
dim(ids)

#将Matrix格式表达矩阵转换为data.frame格式
exprSet <- data.frame(expression_data)
dim(exprSet)

#给表达矩阵新增加一列ID
exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
dim(exprSet)
#矩阵表达文件和平台文件有相同列'ID',使用merge函数合并
express <- merge(x = exprSet, y = ids, by.x = "ID")

#删除探针ID列
express$ID =NULL


dim(express) 

matrix = express
dim(matrix)
#查看多少个基因重复了
table(duplicated(matrix$Gene.Symbol))

#把重复的Symbol取平均值
matrix <- aggregate(.~Gene.Symbol, matrix, mean)  ##把重复的Symbol取平均值
row.names(matrix) <- matrix$Gene.Symbol  #把行名命名为SYMBOL

dim(matrix)

matrix_na = na.omit(matrix)   #去掉缺失值
dim(matrix_na)
matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]
dim(matrix_final)

matrix_final <- subset(matrix_final, select = -1)  #删除Symbol列(一般是第一列)
dim(matrix_final)

> dim(matrix_final)

[1] 14826 31

小结

原始数据记录有22283条,多个探针对应一个基因采用取平均值处理,一个探针对应多个基因分别进行直接删除操作和保留第一个基因操作, 两种方法最终获得的数据记录分别为12548,14826。

更新版本的代码全文

# 安装并加载GEOquery包
library(GEOquery)

# 指定GEO数据集的ID
gse_id <- "GSE1297"

# 使用getGEO函数获取数据集的基础信息
gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!

# 提取基因表达矩阵
expression_data <- exprs(gse_info[[1]])

# 提取注释信息
annotation <- featureData(gse_info[[1]])


#查看平台文件列名
colnames(annotation)

#打印项目文件列表
dir() 

# 读取芯片平台文件txt
platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")

#查看平台文件列名
colnames(platform_file)

# 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
#probe_names <- platform_file$ID
#gene_symbols <- platform_file$Gene.Symbol
platform_file_set=platform_file[,c(1,11)]


#一个探针对应多个基因名,保留第一个基因名
ids = platform_file_set
library(tidyverse)
test_function <- apply(ids,
                       1,
                       function(x){
                         paste(x[1],
                               str_split(x[2],'///',simplify=T),
                               sep = "...")
                       })
x = tibble(unlist(test_function))

colnames(x) <- "ttt" 
ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
dim(ids)

#将Matrix格式表达矩阵转换为data.frame格式
exprSet <- data.frame(expression_data)
dim(exprSet)

#给表达矩阵新增加一列ID
exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
dim(exprSet)
#矩阵表达文件和平台文件有相同列'ID',使用merge函数合并
express <- merge(x = exprSet, y = ids, by.x = "ID")

#删除探针ID列
express$ID =NULL


dim(express) 

matrix = express
dim(matrix)
#查看多少个基因重复了
table(duplicated(matrix$Gene.Symbol))


#把重复的Symbol取平均值
matrix <- aggregate(.~Gene.Symbol, matrix, mean)  ##把重复的Symbol取平均值
row.names(matrix) <- matrix$Gene.Symbol  #把行名命名为SYMBOL

dim(matrix)

matrix_na = na.omit(matrix)   #去掉缺失值
dim(matrix_na)

matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]
dim(matrix_final)

matrix_final <- subset(matrix_final, select = -1)  #删除Symbol列(一般是第一列)
dim(matrix_final)
#+  经过注释、探针名基因名处理、删除基因名为空值、删除缺失值 得到最终 matrix_final
#+==================================================================================
#+========================================================================================

已经完成了部分的预处理工作了,在使用数据前还有一系列的质控要做,请看下节数据清洗

相关推荐
沉木渡香1 小时前
[2025分类&时序异常检测指标R-AUC与VUS]
分类·数据挖掘·时序异常检测·vus·r-auc
云天徽上4 小时前
【数据可视化】全国星巴克门店可视化
人工智能·机器学习·信息可视化·数据挖掘·数据分析
大乔乔布斯5 小时前
数据挖掘常用算法模型简介
决策树·数据挖掘·线性回归
周杰伦_Jay6 小时前
简洁明了:介绍大模型的基本概念(大模型和小模型、模型分类、发展历程、泛化和微调)
人工智能·算法·机器学习·生成对抗网络·分类·数据挖掘·transformer
boonya1 天前
StarRocks强大的实时数据分析
数据挖掘·数据分析
sci_ei1232 天前
高水平EI会议-第四届机器学习、云计算与智能挖掘国际会议
数据结构·人工智能·算法·机器学习·数据挖掘·机器人·云计算
Denodo2 天前
10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据
大数据·数据库·数据仓库·人工智能·数据挖掘·数据分析·数据编织
Zda天天爱打卡2 天前
【机器学习实战高阶】基于深度学习的图像分割
人工智能·深度学习·机器学习·数据挖掘·数据可视化
绒绒毛毛雨2 天前
“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce
人工智能·数据挖掘·mapreduce
机器学习小小白2 天前
【数据挖掘实战】 房价预测
人工智能·python·机器学习·数据挖掘