R语言dplyr按PPCODE分组仅1个异众价格时用众数替换的实现问题
原代码报错的核心原因是count()是dplyr的汇总函数,会对分组数据返回汇总后的表格,不能直接在mutate()的行级判断里作为标量使用,同时原有判断逻辑也不符合需求。
你定义的Mode函数是可用的,调整dplyr管道逻辑即可实现需求:
library(dplyr) # 众数计算函数保持不变 Mode <- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] } pp <- pp %>% group_by(PPCODE) %>% mutate( # 计算当前组价格的众数 mode_price = Mode(PRICE), # 统计当前组内与众数不同的唯一价格数量 abnormal_type_cnt = n_distinct(PRICE[PRICE != mode_price]), # 仅当异常价格只有1种时,将异常值替换为众数,否则保留原价 PRICE = ifelse(abnormal_type_cnt == 1 & PRICE != mode_price, mode_price, PRICE) ) %>% # 移除辅助计算的中间列 select(-mode_price, -abnormal_type_cnt) %>% ungroup()
逻辑调整说明
如果你的实际需求是「与众数不同的观测总数为1」而非「异常价格的种类为1」,仅需要修改abnormal_type_cnt的计算逻辑为abnormal_cnt = sum(PRICE != mode_price),判断条件同步改为abnormal_cnt == 1即可,两种逻辑在你给出的示例中运行结果完全一致,可根据实际业务场景选择。
运行后结果完全符合你的预期:
- PPCODE为4623的分组中,异常值1.42会被替换为众数1.45,其余价格不变
- PPCODE为4111的分组中存在2种与众数不同的价格,所有价格保持原样
内容的提问来源于stack exchange,提问作者Bambeil
相关产品推荐
相关产品推荐

