下面给出一份“从 GEO 下载数据 → 拿到表达矩阵 → 提取所有样本的临床表型信息 → 看懂样本描述字段”的完整思路与实操代码。
所有步骤均以 R 语言 + GEOquery 包完成,适用于芯片或 RNA-seq 的 Series 矩阵文件(GSE***_series_matrix.txt.gz)。如你下载的是 MINiML(GSE***_family.xml)或原始 RAW.tar,只需把文件名换成对应路径即可,提取临床信息的函数不变。
- 安装并加载必备包
if (!requireNamespace("GEOquery", quietly = TRUE))
BiocManager::install("GEOquery")
library(GEOquery)
library(tidyverse) # 方便洗数据
- 把数据“一键”下载到本地(含表达矩阵 + 样本信息)
gse_id <- "GSE61763" # 换成你自己的编号
dir.create(gse_id, showWarnings = FALSE)
getGEO(gse_id, destdir = gse_id, GSEMatrix = TRUE, AnnotGPL = FALSE)
下载完成后,你会在 GSE61763/ 里看到至少 2 个关键文件:
GSE61763_series_matrix.txt.gz← 表达矩阵 + 样本表型GSE61763_family.xml← 更完整的 MINiML 注释(可选)
- 读入对象并快速查看结构
gset <- getGEO(filename = file.path(gse_id, paste0(gse_id, "_series_matrix.txt.gz")),
GSEMatrix = TRUE, AnnotGPL = FALSE)[[1]]
# gset 是一个 ExpressionSet 对象
# 表达矩阵:exprs(gset)
# 样本信息:pData(gset)
- 提取“临床表型信息”——其实就是样本信息表
sampleInfo <- pData(gset) %>% as_tibble(rownames = "gsm_id")
View(sampleInfo)
sampleInfo 里每一行是一个 GSM 样本,每一列是作者提交时填写的“描述字段”。
常见字段(不同 GSE 略有差异):
| 列名示例 | 含义 |
|---|---|
title | 样本一句话标题 |
source_name_ch1 | 组织 / 细胞来源 |
characteristics_ch1.* | 多次追加的临床特征,如年龄、性别、分期、吸烟史… |
treatment_ch1 / treatment_protocol_ch1 | 处理/药物信息 |
extract_protocol_ch1 | RNA 提取方法 |
data_processing | 标准化方法 |
description | 自由文本,最详细的“样本描述” |
- 只保留“有用”的临床字段并重命名
keep_cols <- c("gsm_id",
"source_name_ch1",
grep("^characteristics_ch1", names(sampleInfo), value = TRUE),
"description")
cli <- sampleInfo %>%
select(all_of(intersect(keep_cols, names(sampleInfo)))) %>%
rename_with(~ str_replace(., "characteristics_ch1\\.", "")) %>%
rename(group = source_name_ch1) # 把分组字段改个易记的名字
现在 cli 就是“所有样本的临床表型信息”整洁表。
- 把表达矩阵和临床表型“对齐”
exp <- as.data.frame(exprs(gset)) # 行是探针/基因,列是 GSM
exp <- exp %>% select(all_of(cli$gsm_id)) # 保证列顺序与临床表一致
至此,你手里就有:
exp—— 表达矩阵cli—— 每个样本的临床/表型/描述信息
- 看不懂字段?去网页“批量翻译”
- 打开 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE61763
- 页面最下方 “Supplementary file” 下方有个 Sample table 链接,点进去即可看到所有 GSM 的原始填写内容,比 R 里更直观。
- 若仍缺失关键临床信息(如 TNM 分期、生存时间),可回到该 GSE 的 Publication 栏,下原文 PDF 的 Supplementary Table,通常会把详细临床单独列一张 Excel。
- 常见问题 & 解决
- 下不到表达矩阵?
有些 RNA-seq 数据只给 counts / RAW.tar → 用getGEOSuppFiles(gse_id)取原始 counts,或去 SRA 跑 fastq 上游。 - 样本信息太乱?
用stringr::str_extract/case_when做规则清洗,把“male 43 years”拆成 sex=“male”, age=43。 - 多平台混用?
一个 GSE 含 GPL570、GPL96 等多个芯片 → 先用Meta(gset)$platform_id看平台,再分别getGEO("GPL570", …)取注释,把探针转成 gene symbol 后再合并。
一句话总结
用 GEOquery::getGEO() 把 GSE 读成 ExpressionSet 后,pData() 就是“所有样本的临床表型信息”;description、characteristics_ch1.* 等字段即样本描述;清洗后与你的表达矩阵 exprs() 按 GSM ID 对齐即可开展下游差异分析或 WGCNA。
祝分析顺利!
1万+

被折叠的 条评论
为什么被折叠?



