You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言dplyr如何按分组对多列批量计算百分位数

分组批量计算多列百分位数实现方案

首先修正前置问题:你最初定义list_of_col的写法list_of_col <- total[ -c(2:8,16:21) ]取到的是完整的数据框子集,无法被dplyr的列选择逻辑识别,正确的列选择可以直接在函数内编写,或提前存储目标列的列名向量。


匹配你原有mutate_at框架的写法

你代码中标记为X的位置,传入对每列生效的匿名函数即可,用.指代当前遍历到的目标列,完整可运行代码如下:

# 提前存储目标列名(如果要沿用list_of_col变量的话)
list_of_col <- colnames(total)[-c(2:8,16:21)]

total <- total %>%
  group_by(B) %>%
  mutate_at(list_of_col, ~rank(.)/length(.)) %>%
  ungroup() # 计算完成后取消分组,避免后续操作受分组逻辑影响

代码中~rank(.)/length(.)是purrr风格的简写匿名函数,等价于function(current_col) {rank(current_col)/length(current_col)},会自动按分组应用到你传入的所有目标列上,计算逻辑和你之前单列计算的规则完全一致。


新版dplyr推荐写法(dplyr 1.0.0及以上版本支持)

目前mutate_at已经被兼容性、灵活性更强的across()函数取代,不需要提前单独存储列名变量,直接在across()内使用和select()完全一致的列选择语法即可,代码更简洁:

total <- total %>%
  group_by(B) %>%
  mutate(
    # 直接在across里写排除列的位置规则即可
    across(-c(2:8,16:21), ~rank(.)/length(.))
  ) %>%
  ungroup()

注意:如果目标列存在缺失值NA,可以调整函数逻辑适配,避免计算结果偏差:~rank(., na.last = "keep")/sum(!is.na(.)),该写法会保留NA值的位置,分母自动取对应分组内当前列的非缺失值数量。


内容的提问来源于stack exchange,提问作者Robxaa798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:15:30