基于event_id去重统计,生成各公司Top5缺陷指定格式结果
解决方案
核心需求:按公司分组,统计每个缺陷对应的去重event_id数量,取Top5(不足5则保留全部),将缺陷名称和对应计数分别用分号拼接成字符串,生成与df_answer格式一致的结果。
原代码问题分析
add_count(defect)是全局计数,未按公司分组,统计的是全数据集内缺陷的出现次数,而非各公司内的去重event_id数slice_max(n,5)在summarise中用法错误,summarise要求返回单个值,不能直接返回数据框- 未按需求的统计依据(去重
event_id数)对缺陷排序
修正后的代码
library(dplyr) df <- data.frame(company=c("X","X","X", "X","X","X", "X","X","X", "Y","Y","Y", "Y","Y","Y"), event_id=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15), defect=c("code1","code1","code1", "code1","code3","code3", "code4","code3","code2", "code2","code5","code2", "code6","code2","code5")) df_answer <- df %>% # 按公司+缺陷分组,统计每个缺陷的去重event_id数量 group_by(company, defect) %>% summarise(count = n_distinct(event_id), .groups = "drop_last") %>% # 按计数降序取Top5,不足5则保留全部 slice_max(order_by = count, n = 5, with_ties = FALSE) %>% # 按公司拼接缺陷名称和对应计数 summarise( max_defect_list = paste(defect, collapse = ";"), max = paste(count, collapse = ";") ) # 输出结果 df_answer
运行结果
# A tibble: 2 × 3 company max_defect_list max <chr> <chr> <chr> 1 X code1;code3;code2;code4 4;3;1;1 2 Y code2;code5;code6 3;2;1
关键修正说明
- 精准统计计数:通过
company+defect双重分组,用n_distinct(event_id)得到各公司下每个缺陷的唯一事件数,匹配需求统计依据 - 正确筛选TopN:
slice_max指定排序字段为count,drop_last确保分组层级正确,只保留公司分组用于后续拼接 - 格式匹配输出:用
paste(..., collapse = ";")将缺陷名和计数分别拼接成符合要求的字符串格式 - 兼容不足5个的情况:
slice_max(n=5)会自动保留所有不足5个的缺陷,无需额外处理
内容的提问来源于stack exchange,提问作者Ashti
相关产品推荐
相关产品推荐

