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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:45:03