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

R语言实现同ppcode下仅单数字差异异常价格转换问题求助

R语言同ppcode下单字符差异异常价格修正方案

实现思路

首先将数据按ppcode分组,依次完成以下判定:

  • 提取每组价格的众数作为基准统一价格
  • 统计每组与基准价格不同的异常条目数量,仅异常数为1的分组进入下一步处理
  • 对唯一的异常价格,将其与基准价格统一转换为等长字符串后逐位比较差异位数
  • 仅差异位数为1时,将异常价格替换为基准价格,其余场景均保留原始价格

可直接运行的代码

# 加载依赖包,未安装可先运行 install.packages(c("dplyr", "stringr"))
library(dplyr)
library(stringr)

# 自定义函数:计算两个价格的字符差异位数
count_price_diff <- function(price_a, price_b) {
  # 转换为字符并补前导零对齐长度,避免整数位位数不同导致计数错误
  a_str <- str_pad(as.character(price_a), width = 10, side = "left", pad = "0")
  b_str <- str_pad(as.character(price_b), width = 10, side = "left", pad = "0")
  # 逐位对比统计不同的位数
  sum(str_split(a_str, "")[[1]] != str_split(b_str, "")[[1]])
}

# 核心处理逻辑,raw_data为你的原始数据框,需包含ppcode、price两列
processed_data <- raw_data %>%
  group_by(ppcode) %>%
  mutate(
    # 计算本组占多数的基准价格(众数)
    base_price = as.numeric(names(which.max(table(price)))),
    # 统计本组异常价格数量
    abnormal_num = sum(price != base_price)
  ) %>%
  # 仅处理只有1个异常值的分组
  filter(abnormal_num == 1) %>%
  mutate(
    # 计算异常值与基准价格的差异位数
    diff_num = ifelse(price != base_price, count_price_diff(price, base_price), 0),
    # 符合条件则替换为基准价格
    final_price = ifelse(diff_num == 1, base_price, price)
  ) %>%
  ungroup() %>%
  # 合并未处理的分组数据
  right_join(raw_data, by = c("ppcode", "price")) %>%
  mutate(final_price = coalesce(final_price, price)) %>%
  select(ppcode, original_price = price, final_price)

验证说明

提到的示例场景均可正常匹配:

  • 基准价格1.45,异常价格1.42:差异位数1,替换为1.45
  • 基准价格1.45,异常价格1.55:差异位数1,替换为1.45
  • 基准价格1.45,异常价格2.45:差异位数1,替换为1.45
    如果需要调整价格位数对齐规则,可修改str_pad函数的width参数即可。

内容的提问来源于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 23:06:03