计算数据集列的百分位数

53

亲爱的R语言专家们,我有一个简短的问题:

我正在做一项作业,在这个练习中,我被要求从内置的infert数据集中获取基本统计信息,特别是其中的一列infert$age

对于任何不熟悉该数据集的人:

> table_ages     # Which is just subset(infert, select=c("age"));
    age
1    26
2    42
3    39
4    34
5    35
6    36
7    23
8    32
9    21
10   28
11   29
...
246  35
247  29
248  23

我已经找到了该列的中位数、方差、偏度和标准差,一切都很正常,直到我被要求 找到“百分位数”列

到目前为止,我还没有找到任何东西,也许是我从希腊语——作业的语言——错误地翻译过来了。它应该是“ποσοστημόρια”,谷歌翻译将其英文术语定为“percentiles”。

有没有关于如何找到infert$age的这些“百分位数”的教程或想法?


8
看一下?quantile吗? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto 这看起来足够基础,可以与其他练习的感觉相匹配。我想那就是它了。你刚刚推动我找到了解决方案,谢谢 :p - Dimitris Sfounis
5个回答

75
如果你订购了一个向量 x,并找到了在该向量中间的值,那么你就找到了中位数或第50个百分位数。相同的逻辑也适用于任何百分比。以下是两个例子。
x <- rnorm(100)
quantile(x, probs = c(0, 0.25, 0.5, 0.75, 1)) # quartile
quantile(x, probs = seq(0, 1, by= 0.1)) # decile

39

quantile()函数可以满足大多数需求,但由于问题含糊不清,我提供一个替代答案,与quantile()稍有不同。

ecdf(infert$age)(infert$age)
会生成一个与infert$age长度相同的向量,给出每个观测值下方的infert$age比例。你可以阅读ecdf文档,但基本思想是ecdf()将给你一个函数,返回经验累积分布。因此,ecdf(X)(Y)是X在Y点的累积分布值。如果你只想知道低于30的概率(因此30位于样本中的百分位数),你可以这样说:
ecdf(infert$age)(30)

这种方法与使用 quantile() 函数的主要区别在于,quantile() 要求您输入概率以获得水平,而此方法要求您输入水平以获取概率。


22

使用 {dplyr}:

library(dplyr)

# percentiles
infert %>% 
  mutate(PCT = ntile(age, 100))

# quartiles
infert %>% 
  mutate(PCT = ntile(age, 4))

# deciles
infert %>% 
  mutate(PCT = ntile(age, 10))

7
table_ages <- subset(infert, select=c("age"))
summary(table_ages)
#            age       
#  Min.   :21.00  
#  1st Qu.:28.00  
#  Median :31.00  
#  Mean   :31.50  
#  3rd Qu.:35.25  
#  Max.   :44.00  

这可能是他们正在寻找的内容。对数字应用summary(...)将返回数据的最小值、最大值、平均值、中位数以及第25和75百分位数。

请注意,

summary(infert$age)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   21.00   28.00   31.00   31.50   35.25   44.00 

数字相同但格式不同。这是因为table_ages是一个只有一列(ages)的数据框架,而infert$age是一个数值向量。尝试输入summary(infert)

1
您还可以使用hmisc包,该包将为您提供以下百分位数:0.05、0.1、0.25、0.5、0.75、0.9和0.95。只需使用describe(table_ages)即可。

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