首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机次采样seurat对象

随机次采样seurat对象
EN

Stack Overflow用户
提问于 2021-11-29 19:15:01
回答 1查看 512关注 0票数 1

我一直在尝试随机地对我的seurat物体进行次采样。我对基于2列的次抽样感兴趣:条件和单元类型。我有5种情况和5种细胞类型。主要目标是在每种情况下为每种细胞类型设置1000个单元。到目前为止我已经尝试过:

第一件事是删除我的seurat对象:

代码语言:javascript
复制
 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...)

然后使用sample函数对其进行子示例:

代码语言:javascript
复制
set.seed(0)
my.list.sampled <- lapply(X = my.list, FUN = function(x) {
  x <- x[,sample(ncol(x), 1000, replace = FALSE)]
})

我得到了这个错误,因为有些对象的单元格小于1000个:在为函数选择方法时计算参数'j‘中的错误[’:当‘替换=假’时不能取大于总体的样本。

然后我尝试使用这个函数:

代码语言:javascript
复制
lapply_with_error <- function(X,FUN,...){    
  lapply(X, function(x, ...) tryCatch(FUN(x, ...),
                                      error = function(e)NULL))
}

但在那些小于1000个单元格的对象中,它给出了0。怎样才能跳过那些小于1000个单元格的对象,并将其保持原样(而不是对那些对象进行采样)?是否有一种更简单的方法来做到这一点,这样我就不必单独地对所有对象进行子集了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 19:47:28

在没有看到数据的情况下,我不能肯定地说,但是您能在函数中添加一个if语句吗?看上去你是按列抽样,所以检查列的数量。如果列数小于要抽样的数目,只需返回x。

代码语言:javascript
复制
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以外的东西,你可以让它变得更灵活。

代码语言:javascript
复制
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
  }
 })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70160160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档