R中指定列百分位秩计算及结果作为新列追加至数据框的方法
R 数据框批量计算百分位秩实现方法
方法1:基础R实现(无额外依赖)
# 定位待计算的列范围:第10至31列 target_cols <- 10:31 # 批量计算每列百分位秩 pr_res <- lapply(df[, target_cols], function(col) { # 百分位秩计算逻辑,默认输出0-100区间,不需要*100可删除 rank(col, na.last = "keep") / length(na.omit(col)) * 100 }) # 新列统一加PR_前缀 colnames(pr_res) <- paste0("PR_", colnames(pr_res)) # 结果合并到原数据框 df <- cbind(df, pr_res)
参数说明:
rank()的na.last参数可调整NA值处理逻辑,设为TRUE时NA排在末尾参与计算,FALSE排在最前,"keep"则对应位置保留NA。
方法2:tidyverse 实现(代码更简洁)
适合习惯dplyr语法的用户,用across批量处理列:
library(dplyr) df <- df %>% mutate(across( .cols = 10:31, # 待计算列范围 .fns = ~ rank(.x, na.last = "keep") / length(na.omit(.x)) * 100, .names = "PR_{.col}" # 新列名规则,自动加PR_前缀 ))
简化示例验证
对应你给出的测试数据,运行后结果符合预期:
# 构造测试数据 test_df <- data.frame( ID = c(1,2,3), Age = c(20,30,40), Type = c("SH","FH","WG"), Value_Added = c(87.9,43.9,23.2) ) # 计算第4列的百分位秩 test_df <- test_df %>% mutate(across( .cols = 4, .fns = ~ rank(.x)/length(.x)*100, .names = "PR_{.col}" ))
运行后得到的PR_Value_Added列结果为100、66.67、33.33,符合百分位秩计算逻辑。
内容的提问来源于stack exchange,提问作者JBA_1990
相关产品推荐
相关产品推荐

