如何将矩阵排名降低20%?

时间:2014-12-02 23:30:54

标签: r list matrix

我有一个list,其中包含33 matrices。这是一个matrix示例:

a <- matrix(c(0.44, 0.33, 0.43, 0.54, 0.42, 0.49, 0.48, 0.51, 0.48, 0.55, 0.35, 0.51, 0.50, 0.34, 0.37), 1,15)
colnames(a) <- c("ACES4", "AMBV4", "ARCZ6", "BBAS3", "BBDC4", "BRAP4", "BRKM5", "BRTP3", "BRTP4", "CESP5", "CGAS5", "CLSC4", "CMIG3", "CMIG4", "DASA3")

我需要知道20%的值是多少。在这种情况下,将是3值(有15个值,所以20%是3对......):

print(a[,c(2,11,14)])
AMBV4 CGAS5 CMIG4 
 0.33  0.35  0.34 

我怎样才能立刻做到这一点?我必须使用list生成相同的33 matrices,但每个matrix只包含此成分。它必须以20%而不是3来完成,因为matrix中每个list的总金额会有所不同。

对不起这个可能很愚蠢的问题。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

基础R

a[a <= quantile(a, 0.2)]
[1] 0.33 0.35 0.34

dplyr

library(reshape2)
library(dplyr)
b <- as.tbl(melt(a))
b %>%
  filter(value, percent_rank(value) < .2)
#    Source: local data frame [3 x 3]
#
#  Var1  Var2 value
#1    1 AMBV4  0.33
#2    1 CGAS5  0.35
#3    1 CMIG4  0.34

答案 1 :(得分:1)

假设您有2个矩阵而不是33个。

可以通过lappy轻松完成:

a <- matrix(c(0.44, 0.33, 0.43, 0.54, 0.42, 0.49, 0.48, 0.51, 0.48, 0.55, 0.35, 0.51, 0.50, 0.34, 0.37), 1,15)
colnames(a) <- c("ACES4", "AMBV4", "ARCZ6", "BBAS3", "BBDC4", "BRAP4", "BRKM5", "BRTP3", "BRTP4", "CESP5", "CGAS5", "CLSC4", "CMIG3", "CMIG4", "DASA3")
b <- matrix(c(0.49, 0.33, 0.43, 0.54, 0.62, 0.49, 0.48, 0.51, 0.58, 0.55, 0.35, 0.51, 0.50, 0.34, 0.37), 1,15)
colnames(b) <- c("ACES4", "AMBV4", "ARCZ6", "BBAS3", "BBDC4", "BRAP4", "BRKM5", "BRTP3", "BRTP4", "CESP5", "CGAS5", "CLSC4", "CMIG3", "CMIG4", "DASA3")

mylist<-list(a,b)


c <- lapply(mylist, function(x) { as.matrix(x[ x < quantile(x,0.2)])})


    > c
[[1]]
     [,1]
[1,] 0.33
[2,] 0.35
[3,] 0.34

[[2]]
     [,1]
[1,] 0.33
[2,] 0.35
[3,] 0.34

> is.matrix(c[[1]])
[1] TRUE
> 

如您所见,生成一个列表,每个元素是每个矩阵的最小20%值。此外,例如c[[1]]的每个元素都是一个矩阵。

因此,您将得到一个包含33个矩阵的列表,其中只有20%的最小值。

希望它有所帮助!