
数据库分析脓毒症肺损伤的疾病靶点,
获取疾病相关靶点,除了从genecard、omim、disgnet等疾病数据库中搜索,还可以在GEO数据库中检索相关疾病看有无合适的数据集使用。这里记录下在GEO数据库中获取靶点的相关操作。
一般找到合适的数据集后,我们可以拿到基因表达矩阵,做常规的差异基因表达分析,然后把差异基因作为疾病靶点。
比如脓毒症肺损伤,GEO数据库中检索
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),进行并集操作(为了后续研究拿到足够多的基因,这里取了并集),这里我也疑惑作者单个样本是怎么获取差异基因的。

上述单个文件如下图所示

需要对这些文件每个做一下操作,把满足logFC>1或logFC<-1,PValue<0.05的gene_ID拿出来
# 获取每个病人关于肺的差异基因
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一个个读取太麻烦,可以循环读取

# 文件路径列表
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)) 是用来提取文件名中 sepsis1、sepsis2 等部分的正则表达式。让我们逐步拆解这段代码:
sub():是 R 中的一个函数,用于替换字符串中首次匹配到的模式。它接受三个参数:".\*(sepsis[0-9]+).\*":这是正则表达式模式,具体结构如下:sepsis:字面匹配字符串 "sepsis"。[0-9]+:匹配一个或多个数字(即 1、2、10 等)。 这个模式会从文件名中找到 sepsis1、sepsis2 等部分并将其捕获。
"\\1":\\1:指的是正则表达式中的第一个捕获组((sepsis[0-9]+))。在 R 中,\\1 代表第一个括号捕获的内容(即 sepsisX,X 为数字)。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)) 会得到以下过程:
.*:匹配文件名开头任意字符,直到 sepsis。(sepsis[0-9]+):捕获 sepsis3 。.*:匹配文件名剩余部分。\\1:替换整个文件名为捕获组内容 sepsis3。最终结果就是 sepsis3,这个值被用作键名。
现在想把gene_list中的每个元素中的基因拿出来,做一个并集的操作,可以直接使用Reduce函数
# 计算所有 sepsis 列表的并集
gene_intersection <- Reduce(union, gene_list)
# 查看交集结果
length(gene_union)注:
Reduce() 是 R 中一个强大的高阶函数,用于递归地将一个函数应用于一系列数据元素,从而逐步减少数据的维度或聚合数据。Reduce() 可以被视为一种“聚合”操作,它从一个列表或向量中逐步将元素组合在一起。
基本语法
Reduce(f, x)f:用于将两个元素组合的函数。这通常是像 +、*、intersect() 等函数。x:一个列表或向量,Reduce() 会逐步将列表中的元素组合。Reduce() 如何工作
Reduce() 会从列表的第一个和第二个元素开始,应用函数 f,然后将结果与第三个元素继续应用,直到处理完整个列表。举例来说,给定一个列表 x = list(a, b, c, d) 和函数 f,Reduce(f, x) 会按以下步骤执行:
f(a, b) → 得到结果1f(结果1, c) → 得到结果2f(结果2, d) → 得到最终结果Reduce() 的例子
# 一个向量
x <- c(1, 2, 3, 4)
# 使用 Reduce 计算累加和
Reduce(`+`, x)过程:
1 + 2 → 33 + 3 → 66 + 4 → 10最终结果为 10。
Reduce() 可以递归地找到多个集合的交集。假设我们有多个基因列表,想要找出它们的公共基因(交集):
# 三个基因列表
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)
以交集基因为例
gene_intersection <- Reduce(intersect, gene_list)这个代码做的是:
intersect():用于找出两个向量的共同元素。例如,intersect(a, b) 返回 a 和 b 的交集。gene_list:包含多个 sepsis 列表,每个元素都是一个基因的向量。Reduce(intersect, gene_list):会将 intersect()递归地应用于 gene_list,也就是依次找出所有 sepsis列表的交集。
intersect(sepsis1, sepsis2),找出 sepsis1 和 sepsis2 中的共同基因。intersect(结果, sepsis3),找出前面结果与 sepsis3 的共同基因。sepsisX 列表。最终结果是所有 sepsisX 列表的交集,即在每个列表中都存在的基因。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。