我有一个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
的总金额会有所不同。
对不起这个可能很愚蠢的问题。谢谢你的帮助!
答案 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%的最小值。
希望它有所帮助!