【问题标题】:Randomly subsampling seurat object随机二次采样 seurat 对象
【发布时间】:2022-01-06 15:00:24
【问题描述】:

我一直在尝试对我的 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”时出错:当 '替换 = FALSE'

然后我尝试了这个功能:

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

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

【问题讨论】:

    标签: r sample seurat


    【解决方案1】:

    如果没有看到您的数据,我无法确定,但您可以在函数中添加if 语句吗?看起来您正在按列进行采样,因此请检查列数。如果列数小于您要采样的数量,只需返回 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
      }
     })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2021-08-20
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多