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

基于C1值分组统计:获取分组数、最长组长度及均值

问题:生成指定的分组统计摘要

原始数据

library(dplyr)

DF <- data.frame(
  ID = c(seq(1,14, by = 1)),
  C1 = c(1,0,1,1,1,0,0,3,3,3,0,0,0,0),
  grp = c(1,2,3,3,3,4,4,5,5,5,6,6,6,6)
)

需求说明

需要基于上述数据生成统计摘要,各列定义如下:

  • C1.value:对应C1的取值
  • Grps:该C1值对应的独立grp分组数量
  • longest:该C1值下单个grp分组的最大观测数
  • Mean:该C1值下各grp分组观测数的平均值

目标输出:

C1.value    Grps longest     Mean
1        0       3       4 2.333333
2        1       2       3 2.0
3        3       1       3 3.0

尝试过程及问题

尝试了以下代码:

DF %>% 
  group_by(C1, grp) %>% 
  summarize(Grps = cur_group_id(), N = n()) %>% 
  summarize(Grps = max(Grps), longest = max(N), Mean = mean(N))

得到的结果中Grps列不符合预期,它累加了所有分组的ID,而非每个C1对应的grp数量:

# A tibble: 3 × 4
     C1  Grps longest  Mean
  <dbl> <int>   <int> <dbl>
1     0     3       4  2.33
2     1     5       3  2   
3     3     6       3  3   

本人实现了一个不够优雅的解决方案:

DF %>% 
  group_by(C1, grp) %>% 
  summarize(Grps = cur_group_id(), N = n()) %>% 
  summarize(Grps = max(Grps), longest = max(N), Mean = mean(N)) %>% 
  mutate (
    Grps.1 = Grps - lag (Grps),
    Grps.1 = if_else (is.na(Grps.1), Grps, Grps.1)
  )

优雅实现方案

核心思路是先统计每个(C1, grp)组合的观测数,再按C1分组计算所需统计量:

DF %>%
  # 统计每个(C1, grp)组合的观测数
  count(C1, grp, name = "N") %>%
  # 按C1分组计算统计指标
  group_by(C1) %>%
  summarize(
    Grps = n(),          # 该C1对应的grp分组数量
    longest = max(N),    # 最大观测数
    Mean = mean(N),      # 平均观测数
    .groups = "drop"     # 取消分组状态
  ) %>%
  # 重命名列匹配目标输出
  rename(C1.value = C1)

运行结果:

# A tibble: 3 × 4
  C1.value  Grps longest  Mean
     <dbl> <int>   <int> <dbl>
1        0     3       4  2.33
2        1     2       3  2   
3        3     1       3  3   

方案说明

  • count(C1, grp)是summarize(N = n())的简洁写法,直接得到分组观测数;
  • 按C1分组后,n()直接返回当前C1对应的grp分组数量,完美匹配需求中的Grps列;
  • .groups = "drop"确保结果不再保留分组状态,避免后续操作受影响;
  • 最后用rename调整列名,完全匹配目标输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:15:24