首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过一行是否高于其列的某个百分位数有效地对数据进行二进制化。

通过一行是否高于其列的某个百分位数有效地对数据进行二进制化。
EN

Stack Overflow用户
提问于 2022-10-02 06:21:06
回答 1查看 56关注 0票数 1

试图编写一个函数,该函数通过高通过滤列值的某些百分位数过滤每一行条目来转换数据。该函数是为单细胞RNA测序数据编写的,但原则上,任何功能都是可行的。在最后转换它,因为它使一些下游代码更干净。

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

示例数据

代码语言:javascript
复制
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秒(可能还需要更多的时间)。

我意识到,从技术上讲,这个函数不仅仅是在最高分位数中寻找值,而是随便什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-02 07:40:18

使用matrixStats::rowQuantiles并开发R语言的矢量化。一眨眼就跑了。

代码语言:javascript
复制
res1 <- t(+(scRNAseq_data > matrixStats::rowQuantiles(as.matrix(scRNAseq_data), probs=.9)))

stopifnot(all.equal(res, res1))

生物导体的MatrixGenerics::rowQuantiles也可能起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73923773

复制
相关文章

相似问题

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