我有一个基因表达矩阵,有32000行和182列。我想在整个矩阵中将R中的过滤函数应用于所有行的前5%中的子集行,这些行的方差,最大值减去中位数和90%分位数减去中位数。
样本矩阵:
mat <- matrix(sample(1000),ncol=10,nrow=50,byrow=TRUE)
提前致谢。
答案 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]
顺便说一句,阅读上面的评论median
与mean
不一样。
答案 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