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 #+================================================================================== #+======================================================================================== 已经完成了部分的预处理工作了,在使用数据前还有一系列的质控要做,[请看下节数据清洗](http://t.csdn.cn/7hBqu "请看下节数据清洗")。

相关推荐
葡萄成熟时_31 分钟前
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【代码篇】A题解题全流程(持续更新)
人工智能·数据挖掘
mosquito_lover12 小时前
Python数据分析与可视化实战
python·数据挖掘·数据分析
Dovis(誓平步青云)4 小时前
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本
人工智能·深度学习·机器学习·数据挖掘·服务发现·智慧城市
大美B端工场-B端系统美颜师6 小时前
定制化管理系统与通用管理系统,谁更胜一筹?
人工智能·信息可视化·数据挖掘·数据分析
西柚小萌新8 小时前
【深度学习:进阶篇】--2.1.多分类与TensorFlow
分类·数据挖掘·tensorflow
dundunmm19 小时前
【论文阅读】Self-Correcting Clustering
论文阅读·深度学习·数据挖掘·聚类
卑微小文1 天前
消费金融用户画像构建:代理 IP 整合多维度信息
爬虫·数据挖掘·数据分析
橘猫云计算机设计1 天前
基于ssm的食物营养成分数据分析平台设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
后端·python·信息可视化·数据挖掘·数据分析·django·毕业设计
慕丹1 天前
虫洞数观系列三 | 数据分析全链路实践:Pandas清洗统计 + Navicat可视化呈现
python·mysql·数据挖掘·数据分析·pandas
Mostcow1 天前
数据分析_Data-Formulator-0.1.7调用Ollama-0.5问题记录
人工智能·数据挖掘·数据分析