R基于行分位数选择每行的数据

时间:2013-11-18 16:02:11

标签: r select row quantile

我有一个包含60行和3036列的数据集。我已经使用rowQuantiles包中的函数matrixStats计算了行分位数。从这里我得到了一个列向量[60,1]。现在,我想从每一行中仅选择高于行分位数的数据。如果我使用以下哪个函数:

datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))

然后我松开了数据维度,只获得了一个数组,而不是一个具有以下维度的矩阵[60,152]。

有人能帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为不需要rowQuantile功能。只需选择最高值达到概率阈值:(编辑注释(第一个版本的索引表达式不正确)

> 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))])

答案 1 :(得分:0)

0.05 * 3036 = 151.8但是在每行中选择大于95%分位数的值并不意味着您将系统地具有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