计算分位数的平均值

4
考虑以下向量:
vec = rnorm(1000)

我希望您能计算这个向量的分位数,然后对每个分位数的向量值求平均值。
我知道获取分位数的方法是:
qtle = quantile(vec, seq(from = 0, to = 1, by = 0.2)

但我不确定如何高效地计算每个分位数内值的平均值(即底部20%的平均值,接下来20%的平均值等)。 有什么想法吗? 谢谢。
2个回答

6
你可以使用findIntervaltapply来实现这个功能。
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 

有5个间隔,但是你的代码返回了6个结果。 - Laurence_jj

1

上述解决方案存在许多缺陷,例如当向量具有许多相同的值或集合为奇数时,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)
}

如果你只需要计算 quantile(x, 0.25) 和 quantile(x, 0.5) 之间数值的平均值:

set.seed(1)
vec = rnorm(1000)
averageQuantile(vec, 0.25, 0.50)
# [1] -0.3397659

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接