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


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

    目录

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

    1.删除该行

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

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

    详细代码案例一删除法

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

    小结

    更新版本的代码全文


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

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

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

    1.删除该行

    1. #处理一个探针对应多个基因
    2. #方案一:【删除该行】
    3. explan_final <- data.frame(explan_final[-grep("///",explan_final$"Gene.Symbol"),])
    4. #去一对多,grep是包含的意思,-就是不包含

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

    1. #方案二:【保留第一个基因名】
    2. ids = platform_file_set #探针列名和基因名两列
    3. library(tidyverse)
    4. test_function <- apply(ids,
    5. 1,
    6. function(x){
    7. paste(x[1],
    8. str_split(x[2],'///',simplify=T),
    9. sep = "...")
    10. })
    11. x = tibble(unlist(test_function))
    12. colnames(x) <- "ttt"
    13. ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
    14. dim(ids) #探针列名和基因名两列

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

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

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

    #把重复的Symbol 取每个基因所有探针的平均值或最大值作为基因的表达量
    matrix <- aggregate(.~Gene.Symbol, matrix, mean)  ##把重复的Symbol取平均值

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

    详细代码案例一删除法

    1. # 安装并加载GEOquery包
    2. library(GEOquery)
    3. # 指定GEO数据集的ID
    4. gse_id <- "GSE1297"
    5. # 使用getGEO函数获取数据集的基础信息
    6. gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!
    7. # 提取基因表达矩阵
    8. expression_data <- exprs(gse_info[[1]])
    9. #查看平台文件列名
    10. colnames(annotation)
    11. #打印项目文件列表
    12. dir()
    13. # 读取芯片平台文件txt
    14. platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")
    15. #查看平台文件列名
    16. colnames(platform_file)
    17. # 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
    18. #probe_names <- platform_file$ID
    19. #gene_symbols <- platform_file$Gene.Symbol
    20. platform_file_set=platform_file[,c(1,11)]
    21. #将Matrix格式表达矩阵转换为data.frame格式
    22. exprSet <- data.frame(expression_data)
    23. #给表达矩阵新增加一列ID
    24. exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
    25. #矩阵表达文件和平台文件有相同列‘ID’,使用merge函数合并
    26. express <- merge(x = exprSet, y = platform_file_set, by.x = "ID")
    27. #删除探针ID列
    28. express$ID =NULL
    29. dim(express)
    30. exprSet = express
    31. #查看多少个基因重复了
    32. table(duplicated(exprSet$Gene.Symbol))
    33. #处理重复基因,计算行平均值方案1
    34. #rowMeans = apply(exprSet[,c(1:12)],1,function(x) mean(as.numeric(x), na.rm = T))####计算行平均值
    35. #处理重复基因,计算行平均值方案2
    36. #matrix <- aggregate(.~Gene.Symbol, matrix, mean) ##把重复的Symbol取平均值
    37. #row.names(matrix) <- matrix$Gene.Symbol #把行名命名为SYMBOL
    38. #处理重复基因,计算行平均值方案3
    39. library(limma) #avereps 函数
    40. exp_unique<-avereps(exp_symbol[,-c(32,ncol(exp_symbol))],ID=exp_symbol$Gene.Symbol)##把重复的Symbol取平均值
    41. #排序
    42. exprSet = exprSet[order(rowMeans, decreasing = T),]
    43. dim(exprSet)
    44. #去掉重复基因
    45. exprSet_2 = exprSet[!duplicated(exprSet[, dim(exprSet)[2]]),]
    46. dim(exprSet_2)
    47. #去掉缺失值
    48. exprSet_na = na.omit(exprSet_2)
    49. explan_final = exprSet_na[exprSet_na$Gene.Symbol != "",]
    50. dim(explan_final)
    51. #处理一个探针对应多个基因[删除法]
    52. explan_final <- data.frame(explan_final[-grep("///",explan_final$"Gene.Symbol"),]) #去一对多,grep是包含的意思,-就是不包含
    53. dim(explan_final)
    54. rownames(explan_final) <- explan_final$Gene.Symbol
    55. dim(explan_final)
    56. explan_final <- explan_final[,c(1:31)]
    57. # 此时explan_final为所需文件,行为基因,列为样本

    > dim(explan_final)
    [1] 12548    31

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

    1. # 安装并加载GEOquery包
    2. library(GEOquery)
    3. # 指定GEO数据集的ID
    4. gse_id <- "GSE1297"
    5. # 使用getGEO函数获取数据集的基础信息
    6. gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!
    7. # 提取基因表达矩阵
    8. expression_data <- exprs(gse_info[[1]])
    9. # 提取注释信息
    10. annotation <- featureData(gse_info[[1]])
    11. #查看平台文件列名
    12. colnames(annotation)
    13. #打印项目文件列表
    14. dir()
    15. # 读取芯片平台文件txt
    16. platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")
    17. #查看平台文件列名
    18. colnames(platform_file)
    19. # 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
    20. #probe_names <- platform_file$ID
    21. #gene_symbols <- platform_file$Gene.Symbol
    22. platform_file_set=platform_file[,c(1,11)]
    23. #一个探针对应多个基因名,保留第一个基因名
    24. ids = platform_file_set
    25. library(tidyverse)
    26. test_function <- apply(ids,
    27. 1,
    28. function(x){
    29. paste(x[1],
    30. str_split(x[2],'///',simplify=T),
    31. sep = "...")
    32. })
    33. x = tibble(unlist(test_function))
    34. colnames(x) <- "ttt"
    35. ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
    36. dim(ids)
    37. #将Matrix格式表达矩阵转换为data.frame格式
    38. exprSet <- data.frame(expression_data)
    39. dim(exprSet)
    40. #给表达矩阵新增加一列ID
    41. exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
    42. dim(exprSet)
    43. #矩阵表达文件和平台文件有相同列‘ID’,使用merge函数合并
    44. express <- merge(x = exprSet, y = ids, by.x = "ID")
    45. #删除探针ID列
    46. express$ID =NULL
    47. dim(express)
    48. matrix = express
    49. dim(matrix)
    50. #查看多少个基因重复了
    51. table(duplicated(matrix$Gene.Symbol))
    52. #把重复的Symbol取平均值
    53. matrix <- aggregate(.~Gene.Symbol, matrix, mean) ##把重复的Symbol取平均值
    54. row.names(matrix) <- matrix$Gene.Symbol #把行名命名为SYMBOL
    55. dim(matrix)
    56. matrix_na = na.omit(matrix) #去掉缺失值
    57. dim(matrix_na)
    58. matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]
    59. dim(matrix_final)
    60. matrix_final <- subset(matrix_final, select = -1) #删除Symbol列(一般是第一列)
    61. dim(matrix_final)

    > dim(matrix_final)
    [1] 14826    31

    小结

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

    更新版本的代码全文

    1. # 安装并加载GEOquery包
    2. library(GEOquery)
    3. # 指定GEO数据集的ID
    4. gse_id <- "GSE1297"
    5. # 使用getGEO函数获取数据集的基础信息
    6. gse_info <- getGEO(gse_id, destdir = ".", AnnotGPL = F ,getGPL = F) # Failed to download ./GPL96.soft.gz!
    7. # 提取基因表达矩阵
    8. expression_data <- exprs(gse_info[[1]])
    9. # 提取注释信息
    10. annotation <- featureData(gse_info[[1]])
    11. #查看平台文件列名
    12. colnames(annotation)
    13. #打印项目文件列表
    14. dir()
    15. # 读取芯片平台文件txt
    16. platform_file <- read.delim("GPL96-57554.txt", header = TRUE, sep = "\t", comment.char = "#")
    17. #查看平台文件列名
    18. colnames(platform_file)
    19. # 假设芯片平台文件中有两列,一列是探针ID,一列是基因名
    20. #probe_names <- platform_file$ID
    21. #gene_symbols <- platform_file$Gene.Symbol
    22. platform_file_set=platform_file[,c(1,11)]
    23. #一个探针对应多个基因名,保留第一个基因名
    24. ids = platform_file_set
    25. library(tidyverse)
    26. test_function <- apply(ids,
    27. 1,
    28. function(x){
    29. paste(x[1],
    30. str_split(x[2],'///',simplify=T),
    31. sep = "...")
    32. })
    33. x = tibble(unlist(test_function))
    34. colnames(x) <- "ttt"
    35. ids <- separate(x,ttt,c("ID","Gene.Symbol"),sep = "\\...")
    36. dim(ids)
    37. #将Matrix格式表达矩阵转换为data.frame格式
    38. exprSet <- data.frame(expression_data)
    39. dim(exprSet)
    40. #给表达矩阵新增加一列ID
    41. exprSet$ID <- rownames(exprSet) # 得到表达矩阵,行名为ID,需要转换,新增一列
    42. dim(exprSet)
    43. #矩阵表达文件和平台文件有相同列‘ID’,使用merge函数合并
    44. express <- merge(x = exprSet, y = ids, by.x = "ID")
    45. #删除探针ID列
    46. express$ID =NULL
    47. dim(express)
    48. matrix = express
    49. dim(matrix)
    50. #查看多少个基因重复了
    51. table(duplicated(matrix$Gene.Symbol))
    52. #把重复的Symbol取平均值
    53. matrix <- aggregate(.~Gene.Symbol, matrix, mean) ##把重复的Symbol取平均值
    54. row.names(matrix) <- matrix$Gene.Symbol #把行名命名为SYMBOL
    55. dim(matrix)
    56. matrix_na = na.omit(matrix) #去掉缺失值
    57. dim(matrix_na)
    58. matrix_final = matrix_na[matrix_na$Gene.Symbol != "",]
    59. dim(matrix_final)
    60. matrix_final <- subset(matrix_final, select = -1) #删除Symbol列(一般是第一列)
    61. dim(matrix_final)
    62. #+ 经过注释、探针名基因名处理、删除基因名为空值、删除缺失值 得到最终 matrix_final
    63. #+==================================================================================
    64. #+========================================================================================

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

  • 相关阅读:
    Go 单元测试之mock接口测试
    Acwing 828. 模拟栈
    Python学习:if else对缩进的要求
    Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】
    python实现外参标定的思路
    【dp树状数组优化】跳跃(jump)
    世界上到底有多少种编程语言
    53. 最大子序和 392.判断子序列 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇
    【CSS】Flex布局及Quasar辅助类之Container
    大数据技术之Hive:先导篇(一)
  • 原文地址:https://blog.csdn.net/zzh1464501547/article/details/133303270