一、理论
①barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz三个文件的内容以及正常的格式:
1)我们打开barcodes.tsv.gz,一般只有一列,可以看到是由“16个字母-1”组成的一串字符,在测序的时候每个细胞和凝胶珠以及水相和油构成了单细胞乳液微滴(GEM),而每个凝胶珠上都有唯一的Barcode片段,由此来区分不同的细胞。
2)我们打开features.tsv.gz,可以看到基因唯一的基因名。“ENSMUSG + 11位数字”是Ensembl 数据库分配的小鼠基因ID,而“Gm + 数字”是小鼠的基因名称。
3)我们打开matrix.mtx.gz可以看到每个基因的表达量的原始值。如果在R里面读入matrix可以看到是稀疏矩阵(一般是为了减少文件大小),转化为dense matrix或者直接打开可以看到cellranger的版本,以及对应一共有的基因数(55357行)、细胞数(8229列)和非零值(20154188)。而下方的数字例如第一个代表:第165行和第一列的值为2。导入是将单细胞RNA测序(scRNA-seq)下机数据经过 Cell Ranger 流程处理后,将结果文件加载到 R 环境中,以便进行后续的数据分析和可视化。Cell Ranger 是 10X Genomics 提供的标准分析流程,其输出文件通常包括:
②相关R包工作原理
1)Read10X:目的就是读入10X的cellranger后的三个文件,形成count矩阵。
Read10X(
data.dir,
gene.column = 2,
cell.column = 1,
unique.features = TRUE,
strip.suffix = FALSE
)
data.dir就是上述三个文件的路径;
“gene.column = 2”就是会对应feature文件的第二列作为基因名字;
“cell.column = 1”会对应barcode文件的第一列为细胞名字;
“unique.features = TRUE”是使基因名唯一,如果有重复的会自动添加后缀以区分,
“strip.suffix = FALSE” 是否移除barcodes中的“-1”后缀。
当整理好对应文件为上述三个文件的gz压缩格式时,只用给对应的data.dir就可。
2)CreateSeuratObject:目的就是最终在R中形成Seruat对象
CreateSeuratObject(
counts,
assay = "RNA",
names.field = 1,
names.delim = "_",
meta.data = NULL,
project = "CreateSeuratObject",
min.cells = 0,
min.features = 0
)
counts:矩阵就是Read10X得到的数据;
assay:指定初始的 assay 名称,默认为 "RNA"
meta.data:这个指额外的细胞元数据,通常是一个数据框,注意元数据的行名需要与 counts 矩阵的列名(细胞名称)匹配。
min.cells:仅保留在至少在多少个细胞中表达的基因。
例如min.cells = 3会过滤掉在少于3个细胞中表达的基因。
min.features:仅保留检测到至少多少个基因的细胞。
例如min.features = 200会过滤掉检测到少于200个基因的细胞。
③其他读入方式
如果上述文件格式不标准可以对应去修改,对于txt/csv/tsv 文件、HDF5文件的读入未来我们将会继续分享。
二、实践
数据来源:
我们接下来要使用的所有单细胞转录组分析均用以下自行构建的示例数据:
链接: https://pan.baidu.com/s/1q3dQXmmFmaOeTLLJ_Gjm6Q 提取码: 8yhh
可以看到一共有17个样本(4个case和13个control),已经整理好对应样本的filtered_feature_bc_matrix。里面均整理好了三个文件。
①R包环境
library(Seurat)
library(tidyverse)
②文件位置
# 设置基础路径
base_path <- " ../outputs"
# 获取所有子文件夹
folders <- list.dirs(base_path, full.names = FALSE, recursive = FALSE)
③读入数据
# 创建一个列表来存储所有的Seurat对象seurat_list <- list()
# 循环读取每个文件夹
for(folder in folders) {
# 构建完整的路径
full_path <- file.path(base_path, folder, "filtered_feature_bc_matrix")
# 使用文件夹名称作为样本名
sample_name <- folder
# 读取数据并创建Seurat对象
tryCatch({
data <- Read10X(data.dir = full_path)
seurat_obj <- CreateSeuratObject(counts = data, project = sample_name, min.cells = 3, min.features = 200)
# 将对象存储在列表中
seurat_list[[sample_name]] <- seurat_obj
# 打印进度信息
cat(sprintf("Successfully processed %s\n", folder))
}, error = function(e) {
cat(sprintf("Error processing %s: %s\n", folder, e$message))
})
}
最终我们可以看到17个样本已经成功读入R中了!