如何在 r 中轻松计算百分位数(附示例)


数据集的第n百分位数是当所有值从小到大排序时截掉前n %的数据值的值。

例如,数据集的第 90 个百分位数是将底部 90% 的数据值与顶部 10% 的数据值分开的值。

最常用的百分位数之一是第 50 个百分位数,它表示数据集的中值:这是所有数据值中 50% 低于该值的值。

百分位数可用于回答以下问题:

  • 学生需要在特定测试中取得多少分数才能进入前 10%?为了回答这个问题,我们需要找到所有分数的第 90 个百分位数,该值是将排名后 90% 的分数与排名前 10% 的分数分开的值。
  • 特定学校学生平均身高的一半是多少?为了回答这个问题,我们需要找到身高的第 75 个百分位数和身高的第 25 个百分位数,这两个值决定了中间 50% 身高的上限和下限。

如何在 R 中计算百分位数

我们可以使用quantile()函数轻松计算 R 中的百分位数,该函数使用以下语法:

分位数(x, probs = seq(0, 1, 0.25))

  • x:我们希望找到其百分位数的数值向量
  • probs: [0,1] 中的概率数值向量,表示我们希望找到的百分位数

查找向量的百分位数

以下代码说明了如何在 R 中查找给定向量的不同百分位数:

 #create vector of 100 random values uniformly distributed between 0 and 500
data <- runif(100, 0, 500)

#Find the quartiles (25th, 50th, and 75th percentiles) of the vector
quantile (data, probs = c(.25, .5, .75))

# 25% 50% 75% 
#97.78961 225.07593 356.47943 

#Find the deciles (10th, 20th, 30th, ..., 90th percentiles) of the vector
quantile (data, probs = seq(.1, .9, by = .1))

# 10% 20% 30% 40% 50% 60% 70% 80% 
#45.92510 87.16659 129.49574 178.27989 225.07593 300.79690 337.84393 386.36108 
#90% 
#423.28070

#Find the 37th, 53rd, and 87th percentiles
quantile (data, probs = c(.37, .53, .87))

# 37% 53% 87% 
#159.9561 239.8420 418.4787 

查找数据框列的百分位数

为了说明如何查找特定数据框列的百分位数,我们将使用内置数据集iris

 #view first six rows of iris dataset
head(iris)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa

以下代码显示如何查找Sepal.Length列的第 90 个百分位数值:

 quantile (iris$Sepal.Length, probs = 0.9)

#90% 
#6.9

查找多个数据框列的百分位数

我们还可以使用apply()函数一次查找多列的百分位数:

 #define columns we want to find percentiles for
small_iris<- iris[, c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width')]

#use apply() function to find 90th percentile for every column
apply (small_iris, 2, function(x) quantile(x, probs = .9))

#Sepal.Length Sepal.Width Petal.Length Petal.Width 
#6.90 3.61 5.80 2.20

按组搜索百分位数

我们还可以使用dplyr库中的group_by()函数在 R 中按组查找百分位数。

以下代码演示了如何查找每个Sepal.Length的第 90 个百分位数
鸢尾花数据集中的三个物种:

 #load dplyr library
library(dplyr)

#find 90th percentile of Sepal.Length for each of the three species
iris %>%
  group_by (Species) %>%
  summarize (percent90 = quantile(Sepal.Length, probs = .9))

# A tibble: 3 x 2
#Speciespercent90
#            
#1 setosa 5.41
#2 versicolor 6.7 
#3 virginica 7.61

以下代码说明了如何按物种查找所有变量的第 90 个百分位:

 iris %>%
  group_by (Species) %>%
  summarize (percent90_SL = quantile(Sepal.Length, probs = .9),
            percent90_SW = quantile(Sepal.Width, probs = .9),
            percent90_PL = quantile(Petal.Length, probs = .9),
            percent90_PW = quantile(Petal.Width, probs = .9))

# A tibble: 3 x 5
# Species percent90_SL percent90_SW percent90_PL percent90_PW
#                                      
#1 setosa 5.41 3.9 1.7 0.4 
#2 versicolor 6.7 3.11 4.8 1.51
#3 virginica 7.61 3.31 6.31 2.4 

查看百分位数

R 中没有内置函数来可视化数据集的百分位数,但我们可以创建一个绘图来相对轻松地可视化百分位数。

以下代码演示了如何为iris数据集中的Sepal.Length数据值创建百分位图:

 n = length(iris$Sepal.Length)
plot((1:n - 1)/(n - 1), sort(iris$Sepal.Length), type="l",
  main = "Visualizing Percentiles",
  xlab = "Percentile",
  ylab = "Value")

其他资源

R 中 apply()、lapply()、sapply() 和 tapply() 指南
使用 mutate() 和 case_when() 在 R 中创建新变量

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注