基于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
相关产品推荐
相关产品推荐

