考虑以下向量:
vec = rnorm(1000)
我想计算这个向量的五分位数,然后平均每个五分位数的向量值。
我知道获得分位数的方法是:
qtle = quantile(vec, seq(from = 0, to = 1, by = 0.2)
但我不确定如何以有效的方式计算每个分位数内的值的平均值(即最低20%的平均值,接下来的20%的平均值等)。
有什么想法吗?
感谢。
答案 0 :(得分:5)
您可以使用findInterval
和tapply
。
set.seed(1)
vec = rnorm(1000)
qs <- quantile(vec, seq(from = 0, to = 1, by = 0.2))
tapply(vec, findInterval(vec, qs), mean)
# 1 2 3 4 5 6
# -1.46746 -0.54260 -0.02399 0.54492 1.41894 3.81028
答案 1 :(得分:0)
以上解决方案有很多缺陷,即。当vector具有许多相同的值或 集合是奇数,则findInterval方法无法按我们期望的那样工作。
这是我的简单解决方案
averageQuantile<- function(vec, value, value2) {
chunk = getChunkOfVector(vec, value, value2)
if(length(chunk) >0) {
return(mean(chunk))
}
return(0.0)
}
getChunkOfVector<- function(vector, value, value2) {
len = length(vector)
result<-vector()
vector<-sort(vector)
k<-1
for(i in vector){
if(k/len > value & k/len <= value2) {
result = append(result, i)
}
k<-k+1
}
return(result)
}
因此,如果您只需要分位数(x,0.25)和分位数(x,0.5)之间的平均值:
set.seed(1)
vec = rnorm(1000)
averageQuantile(vec, 0.25, 0.50)
# [1] -0.3397659