随机子采样 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
}
})
我一直在尝试随机抽样我的 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
}
})