我一直在尝试随机地对我的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...)然后使用sample函数对其进行子示例:
set.seed(0)
my.list.sampled <- lapply(X = my.list, FUN = function(x) {
x <- x[,sample(ncol(x), 1000, replace = FALSE)]
})我得到了这个错误,因为有些对象的单元格小于1000个:在为函数选择方法时计算参数'j‘中的错误[’:当‘替换=假’时不能取大于总体的样本。
然后我尝试使用这个函数:
lapply_with_error <- function(X,FUN,...){
lapply(X, function(x, ...) tryCatch(FUN(x, ...),
error = function(e)NULL))
}但在那些小于1000个单元格的对象中,它给出了0。怎样才能跳过那些小于1000个单元格的对象,并将其保持原样(而不是对那些对象进行采样)?是否有一种更简单的方法来做到这一点,这样我就不必单独地对所有对象进行子集了吗?
发布于 2021-11-29 19:47:28
在没有看到数据的情况下,我不能肯定地说,但是您能在函数中添加一个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
}
})https://stackoverflow.com/questions/70160160
复制相似问题