如何用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
相关产品推荐
相关产品推荐

