随机子采样 seurat 对象

Randomly subsampling seurat object

我一直在尝试随机抽样我的 seurat 对象。 我对基于 2 列的子采样感兴趣:条件和单元格类型。我有 5 种条件和 5 种细胞类型。主要目标是在每种条件下每种细胞类型有 1000 个细胞。 到目前为止我已经试过了:

首先是对我的 seurat 对象进行子集化:

 my.list <- list(hipo.c1.neurons = hipo %>% 
                    subset(., condition %in% "c1" & group %in% "Neurons"),
                 hipo.c1.oligo = hipo %>% 
                    subset(., condition %in% "c1" & group %in% "Oligod")...etc...)

然后使用样本函数对其进行二次采样:

set.seed(0)
my.list.sampled <- lapply(X = my.list, FUN = function(x) {
  x <- x[,sample(ncol(x), 1000, replace = FALSE)]
})

我收到此错误,因为有些对象的单元格少于 1000 个:评估参数时出错 'j' 选择函数“[”的方法时:无法抽样大于 'replace = FALSE'

时的人口

然后我尝试了这个功能:

lapply_with_error <- function(X,FUN,...){    
  lapply(X, function(x, ...) tryCatch(FUN(x, ...),
                                      error = function(e)NULL))
}

但是在那些少于 1000 个单元格的对象中它给了我 0。跳过那些少于 1000 个单元格的对象并保持原样(不对那些对象进行采样)的方法是什么? 有没有更简单的方法来做到这一点,这样我就不必分别对所有对象进行子集化?

没有看到你的数据我不能肯定地说,但你能不能在函数中添加一个 if 语句?看起来您正在按列采样,因此请检查列数。只要 return x 如果列数少于您想要抽样的数量。

set.seed(0)
my.list.sampled <- lapply(X = my.list, FUN = function(x) {
  if(ncol(x) > 1000){
    x <- x[,sample(ncol(x), 1000, replace = FALSE)] 
  } else {
    x
  }
 })

如果你想采样 1000 以外的东西,你可以让它更灵活。

set.seed(0)
my.list.sampled <- lapply(X = my.list, B = 1000, FUN = function(x, B) {
  if(ncol(x) > B){
    x <- x[,sample(ncol(x), B, replace = FALSE)] 
  } else {
    x
  }
 })