题
我有一个带有60行和3036列的数据集。我已经计算了来自rowQuantiles
包的函数生成icodeTagcode的行定量。从这个,我得到一个列向量[60,1]。现在,我想只能从每行中选择,只有比行达到的数据。如果我使用哪个函数如下:
datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))
.
然后我松开数据尺寸并只获取阵列而不是具有以下尺寸的矩阵[60,152]。
有人可以帮助我吗?
谢谢!
解决方案
我不认为需要划线功能。刚刚挑选出最高值达到概率阈值:(编辑注释(第一个版本具有不正确的索引表达式)
> apply( dat, 1, function(x) x[order(x)][1:( (1-0.95)*ncol(dat))])
obs1 obs2 obs3
11.5379 856.3470 136.8860
.
一如既往地,因为r矩阵是面向列的,您可能希望在结果中使用t()
,以使其回到您期望的行方向。
到您的评论:修复它,以便它拾取最高值而不是最低值:
apply( dat, 1, function(x)
x[order(x, decreasing=TRUE)][1:( (1-0.95)*ncol(dat))])
. 其他提示
0.05 * 3036 = 151.8
但在每行中选择的值大于95%smasterile并不意味着您将系统地具有152个值。如果要保留对象维度,您可以尝试使用NA
替换不期望的值。
由于您的对象并不巨大,您还可以使用数据帧对象,并沿着行维度进行观察。
library(matrixStats)
# To extract your values...
myfun <- function(k, q){x[k, x[k,] > q]}
x <- matrix(sample(1:100, 60*3036, replace=TRUE), ncol=3036)
xx <- mapply(myfun, seq(along=x[,1]), rowQuantiles(x, probs=.95))
# xx is a list, xx[[1]] contains the values of x[1,] > quantile(x[1, ], .95)
# The number of selected values depends on their distribution - with NORM should be stable
x11() ; par(mfrow=c(2,1))
hist(sample(1:100, 60*3036, replace=TRUE)) # UNIF DISTRIB
n.val <- sapply(xx, length)
hist(n.val, xlab="n.val > q_95%")
abline(v=152, col="red", lwd=5)
# Assuming you want the same number of value for each row
n <- min(n.val)
myfun <- function(x){sample(x, n)} # Representative sample - Ordering is possible but introduce bias. Depends on your goals
xx <- t(sapply(xx, myfun))
dim(xx) # 60 n
. 不隶属于 StackOverflow