基于行方差的子集矩阵

时间:2018-02-02 10:52:03

标签: r function matrix subset apply

我有一个基因表达矩阵,有32000行和182列。我想在整个矩阵中将R中的过滤函数应用于所有行的前5%中的子集行,这些行的方差,最大值减去中位数和90%分位数减去中位数。

样本矩阵:

mat <- matrix(sample(1000),ncol=10,nrow=50,byrow=TRUE)

提前致谢。

2 个答案:

答案 0 :(得分:1)

一步一步,你会做类似下面的事情。注意我使用matrixStats包来更有效地计算行度量而不是apply,但这也没关系。

当然是带有概率的分位数。 0.5与中位数相同。

# sample matrix with 500 elements
mat <- matrix(sample(500), ncol = 10, nrow = 50)

# relevant metrics per row
row_med <- matrixStats::rowMedians(mat)
row_vars <- matrixStats::rowVars(mat)
row_maxs <- matrixStats::rowMaxs(mat)
row_qntl90 <- matrixStats::rowQuantiles(mat, probs = 0.9)

# top 5% utility function
top5 <- function(x) {
  x >= quantile(x, 0.95)
}

# combine all conditions
row_idx <- top5(row_vars) & top5(row_maxs - row_med) & top5(row_qntl90 - row_med)
# subscript
mat[row_idx, , drop = FALSE]

顺便说一句,阅读上面的评论medianmean不一样。

答案 1 :(得分:0)

您首先需要按行计算方差,根据您的需求获取排名和过滤。请注意,您可以将值向量传递给probs函数的quantile参数。

mat <- matrix(sample(1000),ncol=10,nrow=50,byrow=TRUE)

rv <- apply(mat, MARGIN = 1, FUN = var)

mat[rv >= quantile(rv, probs = 0.95), ]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    3  260  438  869  402  933  338  867   62   217
[2,]   29  833   48  708  450   79  111  538  984   232
[3,]  142  194  268  559  913  661  794  908  819    38