前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据挖掘—疾病靶点获取、批量读取差异基因以及Reduce函数的使用

数据挖掘—疾病靶点获取、批量读取差异基因以及Reduce函数的使用

原创
作者头像
sheldor没耳朵
发布2024-10-18 17:41:24
110
发布2024-10-18 17:41:24
举报
文章被收录于专栏:GEO数据挖掘

数据挖掘—疾病靶点获取、批量读取差异基因以及Reduce函数的使用

1 疾病靶点获取

数据库分析脓毒症肺损伤的疾病靶点,

获取疾病相关靶点,除了从genecard、omim、disgnet等疾病数据库中搜索,还可以在GEO数据库中检索相关疾病看有无合适的数据集使用。这里记录下在GEO数据库中获取靶点的相关操作。

一般找到合适的数据集后,我们可以拿到基因表达矩阵,做常规的差异基因表达分析,然后把差异基因作为疾病靶点。

比如脓毒症肺损伤,GEO数据库中检索

代码语言:r
复制
Sepsis AND (Lung OR Pulmonary) AND "Homo sapiens"[Organism]

我找到了这个数据集GSE237861,数据集的描述如下图,原本打算从count矩阵中挑出来正常组与肺组织组进行差异基因分析。但是发现其给的count矩阵是不完全的(全部的count应该包含82个样本,他上传的数据只有20个样本)

上传的数据只包含这些样本

故退而求其次,拿作者上传的关于肺的每个样本的差异基因(https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE237861),进行并集操作(为了后续研究拿到足够多的基因,这里取了并集),这里我也疑惑作者单个样本是怎么获取差异基因的。

2 批量读取差异基因

上述单个文件如下图所示

需要对这些文件每个做一下操作,把满足logFC>1或logFC<-1,PValue<0.05的gene_ID拿出来

代码语言:r
复制
# 获取每个病人关于肺的差异基因
tmp1 = read.delim("sup/GSE237861_edgeR_all_FDR_0.1_log2FC_1_infected_VS_control_individual_sepsis1.lung.tsv.gz",row.names = 1)
dim(tmp1)
filtered_tmp1 <- tmp1[(tmp1$logFC > 1 | tmp1$logFC < -1) & tmp1$PValue < 0.05, ]
gene_tmp1 <- filtered_tmp1$gene_ID

一个个读取太麻烦,可以循环读取

代码语言:r
复制
# 文件路径列表
file_list <- dir("sup/", full.names = TRUE)
# 初始化一个列表,用于存储每个文件的筛选结果
gene_list <- list()
# 循环遍历每个文件
for (file in file_list) {
  # 读取数据
  tmp <- read.delim(file, row.names = 1  
  # 筛选出符合条件的行
  filtered_tmp <- tmp[(tmp$logFC > 1 | tmp$logFC < -1) & tmp$PValue < 0.05, ] 
  # 提取行名作为基因ID
  gene_ids <- filtered_tmp$gene_ID  
  # 使用正则表达式提取文件名中的 sepsis1, sepsis2 等字段
  sepsis_id <- sub(".*(sepsis[0-9]+).*", "\\1", basename(file))  
  # 将基因ID存入列表,以 sepsisX 为键
  gene_list[[sepsis_id]] <- gene_ids
}

# 查看结果
str(gene_list)

最后就拿到了每个样本的差异基因

ps:关于正则表达式的解释

sub(".*(sepsis[0-9]+).*", "\\1", basename(file)) 是用来提取文件名中 sepsis1sepsis2 等部分的正则表达式。让我们逐步拆解这段代码:

  1. sub():是 R 中的一个函数,用于替换字符串中首次匹配到的模式。它接受三个参数:
  • 第一个参数是正则表达式模式,用于匹配字符串的一部分。
  • 第二个参数是替换字符串,表示我们要用什么来替换匹配到的部分。
  • 第三个参数是输入字符串,也就是我们要操作的对象。
  1. ".\*(sepsis[0-9]+).\*":这是正则表达式模式,具体结构如下:
  • .*:匹配任意字符(除换行符)任意次,这里是用于忽略文件名中的其他部分。
  • (sepsis0-9+):这个部分用括号括起来表示捕获组,意思是我们要捕获并提取以 sepsis开头,后面跟一个或多个数字的字符串。具体解释如下:
    • sepsis:字面匹配字符串 "sepsis"。
    • [0-9]+:匹配一个或多个数字(即 1210 等)。
  • .*:再次匹配任意字符,用于忽略文件名中其他部分。

这个模式会从文件名中找到 sepsis1sepsis2 等部分并将其捕获。

  1. "\\1":
  • 这是替换字符串,它表示我们要用捕获组的内容来替换匹配到的整个模式。
  • \\1:指的是正则表达式中的第一个捕获组((sepsis[0-9]+))。在 R 中,\\1 代表第一个括号捕获的内容(即 sepsisX,X 为数字)。
  1. basename(file):
  • basename() 是 R 的一个函数,用于从路径中提取文件名,不包括路径部分。
  • file 是文件的完整路径,通过 basename(file),我们获取不带路径的文件名。

示例

假设 basename(file) 的结果是 "GSE237861_edgeR_all_FDR_0.1_log2FC_1_infected_VS_control_individual_sepsis3.lung.tsv.gz",执行代码 sub(".(sepsis0-9+).", "\1", basename(file)) 会得到以下过程:

  1. .*:匹配文件名开头任意字符,直到 sepsis
  2. (sepsis[0-9]+):捕获 sepsis3
  3. .*:匹配文件名剩余部分。
  4. \\1:替换整个文件名为捕获组内容 sepsis3

最终结果就是 sepsis3,这个值被用作键名。

3 Reduce函数的使用

现在想把gene_list中的每个元素中的基因拿出来,做一个并集的操作,可以直接使用Reduce函数

代码语言:r
复制
# 计算所有 sepsis 列表的并集
gene_intersection <- Reduce(union, gene_list)
# 查看交集结果
length(gene_union)

注:

Reduce() 是 R 中一个强大的高阶函数,用于递归地将一个函数应用于一系列数据元素,从而逐步减少数据的维度或聚合数据。Reduce() 可以被视为一种“聚合”操作,它从一个列表或向量中逐步将元素组合在一起。

基本语法

代码语言:r
复制
Reduce(f, x)
  • f:用于将两个元素组合的函数。这通常是像 +*intersect() 等函数。
  • x:一个列表或向量,Reduce() 会逐步将列表中的元素组合。

Reduce() 如何工作

Reduce() 会从列表的第一个和第二个元素开始,应用函数 f,然后将结果与第三个元素继续应用,直到处理完整个列表。举例来说,给定一个列表 x = list(a, b, c, d) 和函数 fReduce(f, x) 会按以下步骤执行:

  1. f(a, b) → 得到结果1
  2. f(结果1, c) → 得到结果2
  3. f(结果2, d) → 得到最终结果

Reduce() 的例子

  1. 简单加法:
代码语言:r
复制
# 一个向量
x <- c(1, 2, 3, 4)

# 使用 Reduce 计算累加和
Reduce(`+`, x)

过程:

  • 1 + 2 → 3
  • 3 + 3 → 6
  • 6 + 4 → 10

最终结果为 10

  1. 找交集:

Reduce() 可以递归地找到多个集合的交集。假设我们有多个基因列表,想要找出它们的公共基因(交集):

代码语言:r
复制
# 三个基因列表
list1 <- c("geneA", "geneB", "geneC", "geneD")
list2 <- c("geneB", "geneD", "geneE", "geneF")
list3 <- c("geneB", "geneD", "geneG", "geneH")
# 将基因列表放入一个列表中
gene_lists <- list(list1, list2, list3)
# 使用 Reduce 和 intersect 来找交集
common_genes <- Reduce(intersect, gene_lists)
# 输出交集
common_genes

过程:

  • intersect(list1, list2) → 结果是 c("geneB", "geneD")
  • intersect(结果, list3) → 结果是 c("geneB", "geneD")

最终得到的交集是 c("geneB", "geneD"),即三个列表中都存在的基因。

Reduce() 的常用场景

  • 累积操作:如求和、乘积。
  • 递归聚合:如在多个集合之间找到交集、并集、差集。
  • 递归应用自定义函数:对列表的元素递归地应用特定的函数。

详细解释 Reduce(intersect, gene_list)

以交集基因为例

代码语言:r
复制
gene_intersection <- Reduce(intersect, gene_list)

这个代码做的是:

  1. intersect():用于找出两个向量的共同元素。例如,intersect(a, b) 返回 ab 的交集。
  2. gene_list:包含多个 sepsis 列表,每个元素都是一个基因的向量。
  3. Reduce(intersect, gene_list)

:会将 intersect()递归地应用于 gene_list,也就是依次找出所有 sepsis列表的交集。

  • 第一步:intersect(sepsis1, sepsis2),找出 sepsis1sepsis2 中的共同基因。
  • 第二步:intersect(结果, sepsis3),找出前面结果与 sepsis3 的共同基因。
  • 依次进行,直到遍历完所有 sepsisX 列表。

最终结果是所有 sepsisX 列表的交集,即在每个列表中都存在的基因。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据挖掘—疾病靶点获取、批量读取差异基因以及Reduce函数的使用
    • 1 疾病靶点获取
      • 2 批量读取差异基因
        • 3 Reduce函数的使用
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档