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

R语言tidyverse如何基于自定义阈值列表编程实现分组计数统计

R分组批量统计阈值计数实现方案

你需要的预定义阈值、自动生成统计列的需求,可以完全沿用你之前处理分位数的批量计算思路,不需要硬写重复的summarise统计项,两种适配tidyverse语法的实现方式如下:

方法1:长表统计+透视转宽(和你现有分位数代码逻辑对齐)

这个写法和你之前用enframe处理分位数的流程完全一致,先按分组+阈值维度计算长格式统计结果,再透视成你要的宽表,可读性强,后续改逻辑很方便:

library(tidyverse)
set.seed(1337)
df <- data.frame(cbind(group = seq(1:5), num = sample(x = 1:400, size = 100, replace = T)))

# 预定义阈值列表,后续增删阈值仅修改这个向量即可
levels <- c(50, 100, 150)

programmatic <- df %>% 
  group_by(group) %>% 
  summarise(
    threshold = levels,
    # 遍历阈值批量计算小于当前值的个数
    count = map_dbl(levels, ~sum(num < .x)),
    .groups = "drop"
  ) %>% 
  # 自动生成列名,透视成宽表
  mutate(col_name = paste0("less_than_", threshold)) %>% 
  pivot_wider(
    id_cols = group,
    names_from = col_name,
    values_from = count
  )

# 验证结果和手动计算完全一致
identical(programmatic, as_tibble(manual))
# 运行返回 TRUE

方法2:直接批量生成宽表(无需透视步骤)

如果不想走透视流程,可以直接在summarise里批量生成所有统计列,代码更简洁:

programmatic2 <- df %>% 
  group_by(group) %>% 
  summarise(
    set_names(
      map_dbl(levels, ~sum(num < .x)),
      paste0("less_than_", levels)
    ),
    .groups = "drop"
  )

说明:

  • 两种方法输出结果完全一致,和你手动编写代码生成的manual数据框没有差异
  • 如果需要调整判断规则(比如统计大于阈值、介于两个阈值之间的个数),仅需修改sum()内的判断表达式即可
  • 如果需要新增/删除统计阈值,仅修改最开始定义的levels向量,不需要改动后续统计逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:12:23