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

k10s72fa  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(105)

我在一个框架中有这个专栏,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%百分位值。
1.根据值的百分位数分配1-10的值。(例如,如果10在df的20%-30%百分位数范围内,我分配一个存储在不同列中的值2。
基本上,我试图创建这样的输出(这些值是粗略的估计,而不是基于实际的数据)

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


你能帮帮忙吗?
谢谢

l7mqbcuq

l7mqbcuq1#

这是一种选择:

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

字符串

o3imoua4

o3imoua42#

假设你的值是以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

pod7payv

pod7payv3#

不太清楚您是如何根据示例计算中断的,但从您的描述来看,这应该可以工作

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

6yoyoihd

6yoyoihd4#

或者你可以使用data.table的方式,这要快得多:

library(data.table)
d = data.table(V1 = c(10, 12, 75, 89, 25, 100, 67, 89, 4, 67, 120.2, 140.5, 170.5, 78.1))
d[, percentile:= findInterval(V1, quantile(V1, seq(0,1, by=.1), na.rm=T))]

字符串

相关问题