做单细胞数据分析,我见过太多人不是倒在跑流程那一步,而是连数据都没拿对。从GEO数据库下载单细胞测序数据,听起来就是“点开链接、下压缩包、解压”,但真上手你会发现问题全挤在这一步:要么下错文件,要么下载一半断了,要么解压出来不是自己想要的矩阵格式。我刚接触单细胞项目时,光是把别人公开的数据完整拿下来就折腾了快两天,后来把流程固化成了一套固定动作,凡是走这套动作,基本不会再翻车。这篇文章就把这套流程完整拆给你,标题里说的“5个关键步骤”我都会一步一步展开,新手照着走就行,老手也可以看看有没有漏掉自己能用的避坑点。
1. 先弄明白GEO里到底存了什么东西
很多人一上来就找下载按钮,结果页面里一堆文件不知道点哪个。这不能怪你,GEO的结构本来就不太直观。想下载单细胞数据,第一步不是“下载”,而是先看懂页面上的信息。
1.1 GEO的三种编号:GSE、GSM、GPL各管什么
GEO里最常见的编号有三种,对应三个层级。
- GSE是“系列(Series)”,一个GSE代表一项完整的研究,也就是你最终要下载的那个数据集。
- GSM是“样本(Sample)”,一个GSE下面包含若干个GSM,每个GSM对应一个生物学样本。
- GPL是“平台(Platform)”,描述测序或芯片用的是哪种平台,比如10x Genomics的Chromium、BD Rhapsody等。
对单细胞数据来说,你关心的通常是GSE这个层级。因为作者上传数据时,一般会把所有样本的count matrix打包放到GSE的“Supplementary file”里。打开一个GSE页面,往下拉,你会看到“Supplementary file”一栏,里面可能有单独的.h5文件、.mtx.gz文件,也可能是一个.tar打包文件,这种情况下先下载tar再解压。
我建议你下载前先看一眼页面上“Samples”列表,确认这个GSE里到底有几个样本、对应什么分组。这一步很多人跳过,结果下载完才发现样本数量对不上,或者拿到的是没有细胞过滤的原始矩阵,后面分析全是坑。
1.2 怎么快速判断一个数据集是不是单细胞数据
GEO上不全是单细胞数据,也有大量bulk转录组、甲基化芯片、miRNA芯片。判断一个数据集是不是单细胞,有三个快速办法。
第一,看标题和摘要里有没有“single-cell”“scRNA-seq”“single cell RNA”这些词。这最直接,基本不会错。第二,看Platform信息,如果写的是“10x Genomics”“Chromium Next GEM”“BD Rhapsody”,基本可以确定是单细胞平台。第三,看文件后缀,单细胞数据最常见的交付文件是barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz,或者合并成一个filtered_feature_bc_matrix.h5,这些都是10x Genomics Cell Ranger的标准输出,看到这个基本就稳了。
三种方法配合使用,比单独看任何一项都可靠。比如有的数据集标题里没写“single cell”,但摘要说“we performed scRNA-seq”,这时候要看后缀和平台来确认。
1.3 原始矩阵与处理后的数据,选哪个更省事
单细胞数据在GEO上的交付形态大致分三种:原始FASTQ、Cell Ranger处理后的矩阵、作者二次处理后的矩阵(比如Seurat对象、scanpy h5ad)。
对于大多数只想做下游分析的人,我强烈建议先找“处理后的矩阵”,不要一上来就奔着FASTQ去。FASTQ是原始测序文件,单个样本就是几十GB,你还得自己跑比对和定量,电脑配置不够根本跑不动。如果你只是想复现文章里的分析,或者用自己的方法重新聚类注释,直接下载barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz这套10x标准矩阵就够了,它已经是表达定量后的结果。
有些作者会额外上传“normalized data”或“harmony后的降维结果”,这类文件方便你快速复现,但不适合作为独立分析的起点。因为它们已经经过处理,可能丢失了原始count信息,后面再做差异分析、富集分析时会受限。记住:能拿原始count matrix,就优先拿原始count matrix。
2. 动手前先把工具和环境准备好
下载GEO数据这件事本身不复杂,但你如果只用浏览器,很容易在下载几个GB的tar包时断掉。所以我建议正式开下之前,先花十分钟把工具准备到位。
2.1 你真正需要的工具清单
我常用的工具很少,但每个都能派上用场。
- 浏览器:用来查看数据集页面、确认文件列表,以及下载几十MB的小文件。
- wget或curl:用来下载大文件,支持断点续传,这是重点中的重点。
- 终端或命令行工具:Windows用户可以用PowerShell,macOS和Linux用户直接用终端。
- tar、gzip等解压工具:用来解开
.tar和.gz文件。 - R或Python:R里装Seurat,Python里装scanpy,用来最后验证数据能不能正常读取。
如果你是纯Windows用户,没装过wget,可以用PowerShell里的curl.exe(Windows 10以后自带),或者装一个Git Bash,里面会带wget和curl。我个人更推荐WSL或Git Bash,命令行操作比PowerShell更顺手,而且很多生信教程都是基于Linux命令写的。
2.2 命令行下载的底层逻辑:为什么浏览器容易断
GEO的下载链接本质上就是一个普通的静态文件URL。浏览器下载大文件时,一旦网络中断、电脑休眠、或者浏览器标签页被误关,下载就直接失败,而且很多浏览器不支持断点续传,失败后只能从头再来。单细胞数据动不动就是几百MB到几个GB,从头再来非常折磨人。
命令行工具的思路完全不同。wget和curl支持断点续传,下载中断后重新执行命令,会自动从断点位置继续,而不是重新下。这项能力在连接不稳定的时候几乎是救命稻草。所以我的原则很简单:小于50MB的文件用浏览器,大于50MB的一律用命令行。
注意:下载GEO数据并不需要登录,也不需要用任何额外工具。直接把文件链接丢给wget或curl就行。
2.3 下载策略:小文件直接下,大文件用命令行续传
我一般把下载分成两类:
- 单文件小于100MB:浏览器直接点,或者用wget一条命令搞定。
- 单文件大于100MB,或者是一个包含多个样本的tar包:必须用wget加
-c参数。
另外,我习惯把下载链接和文件大小记录下来,建一个download_log.txt放在项目目录里。这样一旦下载中断,或者过了很久忘了文件来源,还能翻记录找回链接。别小看这个习惯,等我后面讲问题排查时你就知道它有多重要了。
3. 单细胞数据下载的5个关键步骤
下面这套流程就是我每次下载GEO单细胞数据的标准动作。标题里说的5个步骤,对应的就是这一整节的内容,每一步我都会告诉你具体怎么操作,以及我会在哪里截图确认。
3.1 第一步:锁定目标数据集,把元信息记录完整
假设你已经通过文献或者关键词找到了一个目标GSE编号,比如GSExxxxxx(这里用GSExxxxxx做演示,实操时替换成你的真实编号)。打开NCBI GEO页面后,不要急着下文件,先把这几个信息记录到表格里:
- GSE编号
- 物种和人种背景(human还是mouse)
- 组织或细胞类型
- 样本数量
- 分组信息(对照组、处理组等)
- 数据提交日期
- Supplementary file列表及各自大小
这一步看起来繁琐,但价值在于:它能帮你确认这个数据集到底是不是你需要的,还能在下载完以后作为元数据补充到分析里。
页面上你会看到文件名列表,每个文件前面有一个下载箭头。不用担心漏掉,直接往下看Supplementary file那一栏,通常有一个“(http)”链接,点开可以看到完整文件列表。截图页面时,我会重点截这个区域,因为它直接决定后面下什么。
3.2 第二步:对照Supplementary file清单,认准文件类型
到了这一步,你已经能看到所有可下载的文件。单细胞数据最常见的几种交付文件是:
| 文件名特征 | 含义 | 是否需要优先下载 |
|---|---|---|
barcodes.tsv.gz | 细胞条形码列表,每个barcode代表一个细胞 | 是 |
features.tsv.gz | 基因列表,包括基因ID和基因名 | 是 |
matrix.mtx.gz | 稀疏矩阵,记录每个细胞中每个基因的表达值 | 是 |
filtered_feature_bc_matrix.h5 | 以上三个信息合并的HDF5格式文件 | 是 |
*_RAW.tar | 所有样本原始矩阵的打包文件 | 多数情况下是 |
*_seurat.RDS或.rds | Seurat对象,已经处理过的数据 | 可选 |
*_normalized*.csv | 归一化后的表达矩阵 | 可选 |
这里的核心判断逻辑是:优先下“单独的10x标准输出”,其次下tar包,最后才考虑作者提供的Seurat对象。因为10x标准格式最通用,Seurat、scanpy都能直接读,而且保留的信息最全。
如果你看到的是*_RAW.tar,说明作者把所有样本的原始矩阵打包在一起了。你需要下载这个tar文件,然后解压,里面通常会按样本分文件夹,每个文件夹里再放一套barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz。这种情况下,我建议直接下tar包,别一个一个样本下,太容易漏。
3.3 第三步:用命令行批量下载,注意续传和校验
文件类型确认好之后,正式下载。这里我以Linux/macOS终端为例,Windows用户换成Git Bash或WSL同样适用。
先在本地建一个项目目录:
mkdir scRNA_download cd scRNA_download然后复制Supplementary file里的完整下载链接,用wget下载:
wget -c --tries=5 --timeout=60 "https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSExxxxxx&format=file&file=GSExxxxxx_RAW.tar"几个参数的含义:
-c:断点续传。这是最重要的参数,中断后重跑同一条命令就能恢复。--tries=5:失败后自动重试5次。--timeout=60:超过60秒没有响应就重新尝试。
如果你是下载单独的h5文件,链接通常也是这种带download的URL,直接替换file=后面的文件名就行。
下载完成后,先核对一下文件大小和页面上显示的大小是否一致。如果差很多,说明下载不完整,宁可删掉重新下,也不要急着解压。页面上通常有“Supplemental file”的大小标注,比如(36.5 Mb),我每次都拿这个数据对比。
3.4 第四步:解压和格式转换,整理成标准分析结构
下载完成后不要急着分析,先解压并整理好目录结构。tar包用下面命令解压:
tar -xzf GSExxxxxx_RAW.tar解压后,我习惯先跑一下ls -lh看清楚里面有什么,避免对着错误文件操作。
ls -lh如果你的数据是*_RAW.tar且里面包含多个样本,解压后你会看到多个子文件夹。每个子文件夹里可能是一套标准的10x文件,也可能是单独的matrix.mtx.gz。如果文件夹里缺少features.tsv.gz,只看到一个genes.tsv.gz,也不用慌,这是10x早期版本(v2)的命名,genes.tsv等价于features.tsv,只是字段少一些。
如果拿到的是单独的filtered_feature_bc_matrix.h5,就不需要解压了,直接交给下一个分析工具读取就行。但要注意:h5文件也可能损坏,所以读取前最好先用file命令检查文件类型:
file filtered_feature_bc_matrix.h5如果输出显示“Hierarchical Data Format (version 5) data”,说明文件完整,可以进入下一步验证。
3.5 第五步:读取数据快速验证,确认没下错
这是我最建议新手加上的一步。很多人下载完直接开跑,结果跑到一半才发现数据格式不对,回头又是一轮排查。其实验证很简单,用Seurat或scanpy读一下矩阵,几秒钟就知道数据对不对。
R里用Seurat读10x标准目录:
library(Seurat) counts <- Read10X(data.dir = "样本文件夹名/filtered_feature_bc_matrix/") dim(counts) head(rownames(counts)) head(colnames(counts))Python里用scanpy读h5文件:
import scanpy as sc adata = sc.read_10x_h5("GSExxxxxx_filtered_feature_bc_matrix.h5") print(adata.shape) print(adata.X[:5, :5])验证的时候就盯三个点:
- 矩阵的维度是否和页面上的细胞数、基因数大致吻合。
- 行名是否是基因名(如
CD3D、GAPDH),列名是否是形如AAACCTGAGCATGTCC-1的细胞条形码。 - 表达值是否为整数(counts),而不是小数的归一化值。
如果这三点都正常,说明数据下载正确,可以放心进入后续分析。我通常会在这个阶段截一张R或Python的读取结果图,作为“数据是否完整”的判断依据。
4. 下载过程中的常见问题与排查技巧
下载看起来是体力活,但过程中踩过的坑五花八门。我把这些年见过和遇到过的问题整理成了几个典型场景,你碰到的时候可以按图索骥。
4.1 文件下载到一半断掉是最常见的事故
断掉的主要症状是解压时报错,比如“unexpected end of file”。这个报错基本等于告诉你:文件没下全。
排查手段并不复杂。第一步,对比本地文件大小和服务器的文件大小,差一个字节都不行。第二部,用wget重新执行原命令,因为加了-c,它会自动续传到完整为止。第三步,续传完后再次执行file命令检查类型,能正常识别就说明没问题。
我自己还吃过一个亏:下载多个文件时,写了循环脚本但没加-c,有一个文件失败后脚本没有自动重试,导致后续解压一连串报错。后来我把每一条下载命令都固定成带-c --tries=5的模板,再也没出过这种事。
4.2 h5文件打不开,不一定是文件损坏
h5文件读取报错时,新手很容易立刻判断为“文件坏了”。但实际上还有两种常见原因:环境缺依赖,或者文件被截断。
如果是Python环境缺少h5py,scanpy会在读取h5时直接报错。解决办法是先安装依赖:
pip install h5py如果报错信息里提到“Unable to synchronously open file”或“truncated file”,那才是文件损坏,需要用file命令和大小对比进一步确认。
另一种更隐蔽的情况是:文件名虽然是.h5,但实际文件可能是CSV或tar打包内容,只是后缀被改成了.h5。遇到这种情况,直接用file命令看真实格式,会比盯着报错猜半天更有效。
4.3 拿到的是counts还是normalized数据?怎么分辨
这是分析前最容易忽略的问题。单细胞数据里有三种常见值:raw counts、normalized counts、scale data。GEO上作者上传的矩阵多数是raw counts,但也有人上传的是normalized值。
分辨方法很简单:看矩阵里的值是不是整数。raw counts一定是非负整数(比如0、1、5、23),normalized数据会出现小数(比如1.234、2.567)。在scanpy或Seurat里随便取一个earliest的矩阵块看一眼就能分辨。
如果拿到的是normalized数据,而你后续想自己跑标准化流程,那就要小心了。我通常建议直接在GEO页面上找是否有raw counts版本的文件,宁可多下几份备用,也不要拿归一化数据硬着头皮跑差异分析。
4.4 一份新手避坑速查表
我把自己踩过坑频率最高的几个问题整理成了一张表,贴在工位旁边,每次下载都会对照一遍。
| 症状 | 可能原因 | 优先处理方式 |
|---|---|---|
| 解压报unexpected end of file | 下载不完整 | 对比大小,用wget -c续传 |
| 文件夹里没有features.tsv.gz | 10x v2的genes命名 | 把genes.tsv.gz当features用,注意字段 |
| 读进去全是小数 | 作者上传了normalized数据 | 回到GEO找raw count版本 |
| 细胞数比文章里少很多 | 下载的是过滤后矩阵 | 看文件名是filtered还是raw,按需选择 |
| h5打不开 | 环境缺h5py / 文件损坏 | 先pip install h5py,再检查文件大小 |
| tar包解压后看不见子文件夹 | 作者直接平铺了所有样本文件 | 按文件名样本前缀一一对应 |
这张表不是万能的,但它覆盖了我承接单细胞数据下载时90%的求助情况。你遇到问题的时候,先照表排查,大概率能省下一个下午。
5. 从下载到分析的衔接与我的实操心得
数据下载只是第一步,但这一步决定了后续所有分析能否顺利。我想再补充几个我实际操作中总结下来的经验,帮你少走弯路。
5.1 下载完不等于能直接跑,先做这三件事
第一件事,整理目录结构。我习惯在每个项目下建一个data目录,里面按样本分子文件夹,例如:
data/ sample1/ filtered_feature_bc_matrix/ sample2/ filtered_feature_bc_matrix/第二件事,写好样本分组信息表。把每个样本的GSM编号、分组、批次、组织类型整理成CSV。这一步延迟做,后面做合并、去批次、差异分析时你会感谢自己。
第三件事,记录下载日志。把下载链接、文件大小、下载时间、校验结果写进一个文本文件。这个动作看起来多余,但等到数据需要溯源,或者文件出问题需要重新下载时,它能帮你精确找到所有来源。
5.2 我踩过的两个坑,贴出来供你参考
第一个坑是早期我下载某个h5文件后,直接开始聚类,结果发现基因数少得离谱。后来排查才发现,我下载的是raw_feature_bc_matrix.h5,也就是包含所有barcode的版本,里面混着大量空液滴和背景RNA,会导致数据质量极差。正确的选择是filtered_feature_bc_matrix.h5,这是Cell Ranger过滤掉空液滴后的细胞矩阵。从那以后,我每次都会先看文件名里的filtered还是raw再动手。
第二个坑是解压后没有立刻检查文件编码。某个数据集里的features.tsv.gz基因名带有奇怪的非法字符,读进Seurat后一大堆基因无法识别。后来我慢慢养成习惯,下载完先解压,再用zcat features.tsv.gz | head看一眼基因名是否正常,确认格式没问题再进入下游流程。
最后再分享一个小技巧:如果下载的是多个样本的*_RAW.tar,解压后所有样本的文件都被塞在一个文件夹里,排序会很乱。我一般先写一段简单bash脚本,按样本前缀把文件归拢到各自子目录,再继续下一步。这个习惯能帮你省掉后续大量“文件找不到”的麻烦。单细胞下载这个环节,做得越细心,后面分析越省心。