You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GEO的mtx.txt数据创建Seurat对象报错求助(R语言单细胞分析)

问题

我是生物信息学分析及使用R语言Seurat进行单细胞RNA分析的新手,需要分析GEO登录号GSE224727中的GSM7030509、GSM7030510、GSM7030511和GSM7030512样本,数据为mtx.txt格式,不清楚如何创建Seurat对象。

我的操作代码及输出如下:

# 加载数据
data11 <- data.table::fread("GSM7030511.matrix.txt.gz", header = F)
data11[1:5,1:5]

输出结果:

V1        V2                 V3                 V4                 V5
1:                   GID      Gene CGCGATGGAGGC_Tumor CGACGCTTATTG_Tumor CTGGGTCTCTAC_Tumor
2:             CRERECOMB CRERECOMB                  0                  0                  0
3:  ENSMUSG00000000001.4     Gnai3                  0                  0                  0
4: ENSMUSG00000000003.15      Pbsn                  0                  0                  0
5: ENSMUSG00000000028.14     Cdc45                  0                  0                  0

注:前两列为基因信息(Features),从第3列开始的列名为细胞条形码(Barcodes),数值部分构成表达矩阵。

后续处理代码:

# 提取表达矩阵部分
matrix1 <- data11[2:48530 , 3:7278]

# 提取基因信息
Features11 <- data11[, 1:2]

# 加载预先保存的条形码数据
bc1 <- read.table('barcodes1.txt', header = F)
Barcd1 <- as.data.frame(t(bc1))

尝试创建Seurat对象时执行以下代码:

# 创建Seurat对象
rep1 <- ReadMtx(
  mtx = matrix1, 
  features = Features11,
  cells = Barcd1
  )

出现错误:

Error in path.expand(path) : 无效的参数
解决方案

问题原因

ReadMtx()函数的参数要求是文件路径,而非直接传入内存中的数据框/矩阵对象,这是报错的核心原因。

正确步骤

1. 整理数据并转换为标准格式

你的数据是宽表结构,需要先提取关键信息并转为Seurat兼容的稀疏矩阵:

# 加载必要包
library(Seurat)
library(data.table)
library(Matrix)

# 加载数据
data11 <- fread("GSM7030511.matrix.txt.gz", header = F)

# 提取基因名(这里选择V2列的基因符号,也可改用V1列的Ensembl ID)
gene_names <- data11$V2[-1]  # 跳过第一行表头
# 提取细胞条形码
cell_barcodes <- colnames(data11)[-c(1,2)]  # 跳过前两列基因信息列
# 提取表达矩阵并转为稀疏矩阵(节省内存)
exp_matrix <- as.matrix(data11[-1, -c(1,2), with = FALSE])
exp_matrix <- Matrix(exp_matrix, sparse = TRUE)

2. 创建Seurat对象

有两种方式可以创建对象,按需选择:

方法一:直接用内存中的矩阵创建

无需保存文件,直接用整理好的变量生成对象:

seurat_obj <- CreateSeuratObject(
  counts = exp_matrix,
  project = "GSM7030511",
  features = gene_names,
  cells = cell_barcodes
)
方法二:保存为标准mtx文件后读取(适合复用)

先把数据保存为Seurat默认的mtx格式文件,再通过ReadMtx()读取:

# 保存文件
writeMM(exp_matrix, "GSM7030511.mtx")
writeLines(gene_names, "GSM7030511_features.txt")
writeLines(cell_barcodes, "GSM7030511_barcodes.txt")

# 读取并创建对象
rep1 <- ReadMtx(
  mtx = "GSM7030511.mtx",
  features = "GSM7030511_features.txt",
  cells = "GSM7030511_barcodes.txt"
)
seurat_obj <- CreateSeuratObject(counts = rep1, project = "GSM7030511")

3. 批量处理多个样本

针对你需要分析的4个样本,可以用循环批量处理后合并:

# 定义样本ID列表
sample_ids <- c("GSM7030509", "GSM7030510", "GSM7030511", "GSM7030512")
seurat_list <- list()

for (id in sample_ids) {
  # 加载对应样本数据
  data <- fread(paste0(id, ".matrix.txt.gz"), header = F)
  # 提取基因名、条形码和表达矩阵
  gene_names <- data$V2[-1]
  cell_barcodes <- colnames(data)[-c(1,2)]
  exp_matrix <- as.matrix(data[-1, -c(1,2), with = FALSE])
  exp_matrix <- Matrix(exp_matrix, sparse = TRUE)
  # 创建Seurat对象,给条形码加样本前缀避免重复
  seurat_obj <- CreateSeuratObject(
    counts = exp_matrix,
    project = id,
    features = gene_names,
    cells = paste0(id, "_", cell_barcodes)
  )
  seurat_list[[id]] <- seurat_obj
}

# 合并所有样本的Seurat对象
combined_seurat <- merge(
  seurat_list[[1]],
  y = seurat_list[-1],
  add.cell.ids = sample_ids,
  project = "GSE224727"
)

内容的提问来源于stack exchange,提问作者Rafael Rezende

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:19:53