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

如何用dplyr实现动态多阈值数据统计?含多数据框场景

动态多阈值汇总解决方案

单个数据框的动态阈值统计

要实现动态数量阈值的统计,你可以结合dplyr::summarize和across,配合动态生成的列名完成:

library(tidyverse)

# 定义动态阈值
my_thresholds <- c(15, 20)

mtcars |>
  summarize(
    # 遍历阈值索引,生成对应统计列
    across(seq_along(my_thresholds),
           ~ sum(mpg > my_thresholds[.x], na.rm = TRUE),
           # 自动生成test1、test2格式的列名
           .names = "test{.col}")
  )

运行后会得到预期输出:

test1 test2
1    26    14

如果阈值数量调整为5个(比如my_thresholds <- c(10,15,20,25,30)),代码会自动生成5个对应的统计列,完全适配动态变化。

列表形式多数据框的批量统计

针对group_split生成的列表型数据框,你可以用purrr::map_dfr批量处理每个数据框,同时保留分组标识:

方法1:基于列表的批量处理

# 生成分组数据框列表
input_data <- mtcars |> group_split(cyl)

# 批量处理每个数据框
input_data |>
  map_dfr(function(df) {
    # 获取当前分组的标识(如cyl的取值)
    group_id <- unique(df$cyl)
    # 执行动态阈值统计
    stats <- df |>
      summarize(
        across(seq_along(my_thresholds),
               ~ sum(mpg > my_thresholds[.x], na.rm = TRUE),
               .names = "test{.col}")
      )
    # 合并分组标识与统计结果
    mutate(stats, cyl_group = group_id) |>
      relocate(cyl_group) # 将分组列移至最前
  })

方法2:直接用group_by替代split(更简洁)

如果不需要显式生成列表,直接用group_by可以一步完成分组+多阈值统计:

mtcars |>
  group_by(cyl) |>
  summarize(
    across(seq_along(my_thresholds),
           ~ sum(mpg > my_thresholds[.x], na.rm = TRUE),
           .names = "test{.col}"),
    .groups = "drop" # 取消分组状态
  )

两种方法都会输出每个分组的一行统计结果,列包含分组标识和对应阈值的统计数,阈值数量变化时无需修改核心逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:05:37