数据库分析脓毒症肺损伤的疾病靶点,
获取疾病相关靶点,除了从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 删除。