Stringr模式匹配:如何修改代码实现重复商品描述的去重处理?
解决方案
核心思路
放弃按长度截断的固定规则,改用「分割-去重-拼接」的通用逻辑,适配所有重复场景:
- 先将每条商品描述按
,分割为独立的商品名称数组 - 对数组去重,保留每个唯一商品的单个实例
- 最后将去重后的数组重新拼接为字符串
完整实现代码
首先加载需要的依赖包(首次使用可先执行安装命令):
# 安装依赖(仅首次运行需要) install.packages("tidyverse") # 加载工具包 library(tidyverse)
处理数据的核心代码:
df_new <- df %>% mutate( new_items = map_chr( .x = str_split(Product_name, pattern = ", "), # 按分隔符拆分每个商品字符串 .f = ~ str_c(unique(.x), collapse = ", ") # 去重后重新拼接 ) )
可选优化:处理拼写不一致问题
你提供的测试数据中存在同一款商品拼写不一致的情况(比如samsung A02s (3+32)和samsung A02s(3+32)差了一个空格),可以在去重前先做标准化处理,避免同品不同名的问题:
df_new <- df %>% mutate( new_items = map_chr( .x = str_split(Product_name, pattern = ", "), .f = ~ { # 生成标准化名称用于去重匹配,保留原始名称输出 unique_name <- .x[!duplicated(str_remove_all(tolower(.x), "\\s+"))] str_c(unique_name, collapse = ", ") } ) )
处理效果
用你提供的测试数据执行后,new_items列输出如下:
- Samsung Galaxy A03s (4+64)
- Samsung Galaxy A03s (3+32)
- Samsung A32 (6+128)
- samsung A02s (3+32)(开启标准化后会自动合并同品不同名的条目)
- Xiaomi Redmi 10 (6+128)
- Redmi Note 10 Pro (6+128)
内容的提问来源于stack exchange,提问作者Vayder
相关产品推荐
相关产品推荐

