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
相关产品推荐
相关产品推荐

