如何根据R中的百分位数分配数字?

时间:2014-07-29 17:50:47

标签: r

我在数据框中有这个列,df:

10
12
75
89
25
100
67
89
4
67
120.2
140.5
170.5
78.1

我正在尝试

  1. 计算df范围的10%,20%,30%,......,90%百分位值。
  2. 根据值落入的百分位数指定值1-10(例如,如果10位于df的20%-30%百分位数范围内,则指定存储在不同列中的值为2
  3. 基本上,我正在尝试创建这样的输出(这些值是粗略估计,而不是基于实际百分位数)

    10      2
    12      2
    75      4
    89      5 
    25      3 
    100     6 
    67      4
    89      6
    4       1
    67      5
    120.2   7
    140.5   8
    170.5   10
    78.1    5
    

    我不知道如何创建这些百分位数并分配值。

    到目前为止,我只能做到这一点

    quantile(df, c(.1, .2,.3,.4,.5,.6,.7,.8,.9)) 
    
    你可以帮忙吗?

    由于

3 个答案:

答案 0 :(得分:2)

这是一个选择:

d <- read.table(text="10
12
75
89
25
100
67
89
4
67
120.2
140.5
170.5
78.1")

transform(d, percentile=findInterval(V1, quantile(V1, seq(0,1, by=.1))))

# HEAD:
# 
#   V1 percentile
# 1 10          1
# 2 12          2
# 3 75          5
# 4 89          7
# 5 25          3
# 
#   ---  4  rows omitted ---
# 
# TAIL:
#       V1 percentile
# 10  67.0          4
# 11 120.2          9
# 12 140.5         10
# 13 170.5         11
# 14  78.1          6

答案 1 :(得分:1)

假设您的值在x,我会做类似

的事情
 floor((x-min(x)) / (max(x)-min(x)) *10)

分数(x-min(x)) / (max(x)-min(x))表示我们的范围有多远。分母(max(x)-min(x))得到范围,在本例中为170.5 - 4 = 166.5。分子x-min(x)计算我们的范围。

然后我们乘以10并向下舍入,以获得010之间的数字。

> floor((x-min(x)) / (max(x)-min(x))*10)
 [1]  0  0  4  5  1  5  3  5  0  3  6  8 10  4

这会给您在示例中提供的内容产生不同的结果,但最低编号为4,例如10明显属于010%类别不是2030%类别。


修改:如果您对这些值的订单感兴趣,可以

floor(rank(x) / length(x) * 10)

rank给出了

2.0  3.0  7.0  9.5  4.0 11.0  5.5  9.5  1.0  5.5 12.0 13.0 14.0  8.0

然后除以长度(14),类似于上面的乘以10并使用floor

> floor(rank(x) / length(x) * 10)
 [1]  1  2  5  6  2  7  3  6  0  3  8  9 10  5

答案 2 :(得分:0)

根据您的示例,您在计算休息时间方面有点不清楚,但根据您的描述,这应该有效

x<-c(10, 12, 75, 89, 25, 100, 67, 89, 4, 67, 120.2, 140.5, 170.5, 78.1)
qq<-cut(x, breaks=seq(min(x),max(x), length.out=11), include.lowest=T, labels=F)

在这里,我们采用向量并将其分为10组seq(min(x),max(x), length.out=11)(从而使用观察值的范围),因此这些组是

1: 4-26.65
2: 20.65-37.30
3: 37.30-53.95
....
10: 170.50-153.85

然后我们只使用cut命令和这些中断来创建新的ID来获取

 # cbind(x, qq)
          x qq
 [1,]  10.0  1
 [2,]  12.0  1
 [3,]  75.0  5
 [4,]  89.0  6
 [5,]  25.0  2
 [6,] 100.0  6
 [7,]  67.0  4
 [8,]  89.0  6
 [9,]   4.0  1
[10,]  67.0  4
[11,] 120.2  7
[12,] 140.5  9
[13,] 170.5 10
[14,]  78.1  5

如果你真的想使用分位数,你可以使用

qq<-cut(x, breaks=quantile(x, seq(0,1, length.out=11)), include.lowest=T, labels=F) 

会给出

          x qq
 [1,]  10.0  1
 [2,]  12.0  2
 [3,]  75.0  5
 [4,]  89.0  7
 [5,]  25.0  3
 [6,] 100.0  8
 [7,]  67.0  4
 [8,]  89.0  7
 [9,]   4.0  1
[10,]  67.0  4
[11,] 120.2  9
[12,] 140.5 10
[13,] 170.5 10
[14,]  78.1  6