试图编写一个函数,该函数通过高通过滤列值的某些百分位数过滤每一行条目来转换数据。该函数是为单细胞RNA测序数据编写的,但原则上,任何功能都是可行的。在最后转换它,因为它使一些下游代码更干净。
topquantile.binarize <- function(scRNAseq_data, percentile){
# takes in data that is gene by cell
# returns dataframe of cell by gene
# calculates quantile for each gene
# if a gene in a cell is in the top 90th quantile
# that gene is accepted
for (i in c(1:dim(scRNAseq_data)[1])){
filter_value <- quantile(scRNAseq_data[i,], percentile)
filter_value <- as.numeric(filter_value)
high_pass <- function(x) {
if (x > filter_value) {
x <- 1
} else {
x <- 0
}
return(x)
}
scRNAseq_data[i, ] <- apply(scRNAseq_data[i, ], 2, high_pass)
}
return(t(scRNAseq_data))
}示例数据
library(tictoc)
tic()
set.seed(42)
scRNAseq_data <- data.frame(matrix(rnorm(1000*100, mean=0, sd=1), 1000, 100))
res <- topquantile.binarize(scRNAseq_data, 0.9)
toc()您会注意到,即使在每列有1000行的100列上,它的运行速度也很慢,使用tictoc,您将看到它大约需要4秒(可能还需要更多的时间)。
我意识到,从技术上讲,这个函数不仅仅是在最高分位数中寻找值,而是随便什么。
发布于 2022-10-02 07:40:18
使用matrixStats::rowQuantiles并开发R语言的矢量化。一眨眼就跑了。
res1 <- t(+(scRNAseq_data > matrixStats::rowQuantiles(as.matrix(scRNAseq_data), probs=.9)))
stopifnot(all.equal(res, res1))生物导体的MatrixGenerics::rowQuantiles也可能起作用。
https://stackoverflow.com/questions/73923773
复制相似问题