如何在R语言中计算数据框中各变量每个观测值的百分位数?
计算数据框中各变量观测值的百分位数
首先先将你提供的矩阵转换为数据框(也可直接对矩阵操作):
# 还原数据结构 df_matrix <- structure(c(2, 4, 5, 6, 8, 1, 2, 4, 6, 67, 8, 11), dim = c(6L, 2L), dimnames = list(NULL, c("lo", "li"))) # 转为数据框(可选,矩阵也可直接处理) df <- as.data.frame(df_matrix)
方法1:Base R 实现
利用apply()结合经验累积分布函数ecdf(),逐列计算每个观测值的百分位数(即小于等于该值的观测值占该列总数的百分比):
# 定义计算单变量百分位数的函数 get_percentile <- function(col) { ecdf_func <- ecdf(col) ecdf_func(col) * 100 } # 对每列应用函数,得到各观测值的百分位数 result_base <- cbind(df, apply(df, 2, get_percentile)) colnames(result_base) <- c("lo", "li", "lo_pct", "li_pct") print(result_base)
运行结果示例:
lo li lo_pct li_pct 1 2 2 33.33333 16.66667 2 4 4 50.00000 33.33333 3 5 6 66.66667 50.00000 4 6 67 83.33333 100.00000 5 8 8 100.00000 66.66667 6 1 11 16.66667 83.33333
方法2:tidyverse(dplyr)风格实现
如果习惯使用tidyverse工具链,可以用mutate()配合across()批量处理所有列:
library(dplyr) result_dplyr <- df %>% mutate( across( everything(), ~ ecdf(.)(.) * 100, .names = "{.col}_pct" # 自动生成带后缀的列名 ) ) print(result_dplyr)
说明
这里计算的是经验百分位数,核心逻辑是:对于某列的每个观测值,计算该列中小于等于它的观测值数量占总数量的比例,再乘以100得到百分位数,这是最常用的“每个观测值在自身变量中的相对位置”计算方式。
内容的提问来源于stack exchange,提问作者lola
相关产品推荐
相关产品推荐

