如何使用dplyr按变量层级实现指定指标的分组求和?
解决dplyr分组求和的问题
没问题,我来帮你搞定这个运动表现数据的分组求和需求!结合你提到的需求,我会分情况给出清晰的代码示例,帮你快速实现目标。
首先假设你的matchdb2018数据集是长格式(每行对应一个球员-日期-季度的记录,包含Quarter列,值为"Quarter 1"或"Quarter 2"),我们可以这样写代码:
# 先加载需要的包 library(dplyr) library(tidyr) # 用于格式转换(可选) # 核心处理代码 summary_data <- matchdb2018 %>% # 过滤只保留Quarter 1和Quarter 2的数据(如果数据集里有其他季度的话) filter(Quarter %in% c("Quarter 1", "Quarter 2")) %>% # 按球员姓名和日期分组,这是你要求的层级分组核心 group_by(Player.Name, Date, Quarter) %>% # 批量对三个指标求和,自动忽略缺失值 summarize( across( c(Average.Distance, Total.HIR, V6.Distance), ~sum(.x, na.rm = TRUE) ), .groups = "drop_last" # 保留球员和日期的分组,方便后续转格式 ) %>% # 把长格式转成宽格式,让Q1和Q2的结果并列展示(可选,根据你的输出需求调整) pivot_wider( names_from = Quarter, values_from = c(Average.Distance, Total.HIR, V6.Distance), names_glue = "{.name}_{str_replace(Quarter, 'Quarter ', 'Q')}" # 生成类似Average.Distance_Q1的列名 ) %>% ungroup() # 取消分组(可选)
如果你的数据集是宽格式(每个季度的指标是单独列,比如Average.Distance_Q1、Average.Distance_Q2),代码会更简单直接:
summary_data <- matchdb2018 %>% group_by(Player.Name, Date) %>% summarize( # 直接对每个季度的指标分别求和 Average.Distance_Q1 = sum(Average.Distance_Q1, na.rm = TRUE), Average.Distance_Q2 = sum(Average.Distance_Q2, na.rm = TRUE), Total.HIR_Q1 = sum(Total.HIR_Q1, na.rm = TRUE), Total.HIR_Q2 = sum(Total.HIR_Q2, na.rm = TRUE), V6.Distance_Q1 = sum(V6.Distance_Q1, na.rm = TRUE), V6.Distance_Q2 = sum(V6.Distance_Q2, na.rm = TRUE), .groups = "drop" # 分组完成后取消分组,避免后续操作受分组影响 )
关键细节说明:
group_by(Player.Name, Date):严格按照你要求的层级分组,确保每个分组都是同一个球员在同一天的所有数据。across()函数:帮你批量处理多个指标,避免重复写相同的求和代码,让代码更简洁易维护。na.rm = TRUE:避免因为数据中的缺失值导致求和结果变成NA,如果你确认数据集没有缺失值,可以去掉这个参数。pivot_wider():把长格式数据转成更易读的宽格式,如果你更习惯长格式输出,可以直接去掉这一步。
内容的提问来源于stack exchange,提问作者user9460505
相关产品推荐
相关产品推荐

