基于逻辑列对复杂的稀疏矩阵进行子集化

Subset a complex sparse matrix based on a logical column

我正在使用 Seurat 对象,在进行一些质量控制后,我有一个名为 discard 的元数据列,其中包含 TRUEFALSE,具体取决于行是否在问题未通过 QC,应删除。我该怎么做呢?我已经尝试了所有不同风格的 subset 我可以找到文档,但是唯一没有给我错误的方法是 subset(object, object@meta.data$discard) 它给了我一个只有应该丢弃的行的矩阵!! subset(object, subset!=object@meta.data$discard) 对于这种类型的对象显然是不可能的。我怎样才能做到这一点而不迭代来制作一个名为 "keep" 的逆 QC 或同样荒谬的东西?非常感谢任何帮助!

那么,您要永久删除 FALSE 数据吗?如果是的话,我想一个快速的逻辑测试可以工作。

new.meta = meta.data
new.meta[,which(new.meta[,"colposition"] == FALSE)] = NULL

您添加 ! 以获得布尔值的补码,下面是一个示例,它丢弃了样本中的前 10 列,前 10 列。

对于样本,您可以像矩阵一样对其进行子集化:

library(Seurat)
# we use a example dataset
dim(pbmc_small)
[1] 230  80

pbmc_small@meta.data$discard = rep(c(TRUE,FALSE),c(10,70))
newdata = pbmc_small[,!pbmc_small@meta.data$discard]

dim(newdata)
[1] 230  70

table(colnames(pbmc_small)[1:10] %in% colnames(newdata))

FALSE 
   10

否则,您也可以使用名称进行子集化:

id_keep = colnames(pbmc_small)[!pbmc_small@meta.data$discard]
newdata = subset(pbmc_small,cells=id_keep)
dim(newdata)
[1] 230  70