R语言按分组规则删除数据框冗余SJ类型记录的实现问题
R分组统计TYPE_COUNT为0的问题修复
为什么你的统计结果全是0
你写的统计代码sum(TYPE == "RF" & TYPE == "SJ")存在底层逻辑问题:
逐行判断时,单条记录的TYPE值只能是"RF"或"SJ"其中一个,不可能同时等于两个值,因此TYPE == "RF" & TYPE == "SJ"的判断结果全为FALSE,求和后自然所有行的TYPE_COUNT都是0,完全达不到统计组内两类记录存在情况的目的。
符合业务规则的正确实现
业务规则核心判断逻辑是:
- 按
CASE_ID、TIN、MPIN为维度分组 - 若分组内同时存在RF、SJ两类记录,就移除该分组下的SJ行
- 若分组内仅存在单类记录(只有RF、或只有SJ),则全部保留
可直接运行的代码
先准备示例数据:
example_df <- data.frame( CASE_ID = c(123,123,123), TIN = c("BOB","TIM","TIM"), MPIN = c("LONG","SHORT","SHORT"), TYPE = c('SJ','RF','SJ') )
处理代码(需要依赖dplyr包,未安装可先执行install.packages("dplyr")):
library(dplyr) output <- example_df %>% # 按指定维度分组 group_by(CASE_ID, TIN, MPIN) %>% # 标记当前组是否同时存在RF、SJ两类记录 mutate(has_both_type = all(c("RF", "SJ") %in% TYPE)) %>% # 过滤规则:删除「组内同时有两类记录」的分组下的SJ行,其余行全部保留 filter(!(has_both_type == TRUE & TYPE == "SJ")) %>% # 解除分组,恢复常规数据框结构 ungroup()
运行后得到的结果和预期输出完全一致:
> output CASE_ID TIN MPIN TYPE 1 123 BOB LONG SJ 2 123 TIM SHORT RF
简化写法
如果不需要保留辅助统计列,可将判断逻辑直接写入filter环节,减少冗余列:
output <- example_df %>% group_by(CASE_ID, TIN, MPIN) %>% filter(!(all(c("RF", "SJ") %in% TYPE) & TYPE == "SJ")) %>% ungroup()
小提示:如果后续遇到组内同TYPE重复多条的极端情况,只要规则是同时存在两类记录就剔掉所有SJ行,上述逻辑依然适用,不需要额外修改。
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

