R语言strsplit函数报错排查:非字符参数问题及薯片数据筛选
超市薯片销售数据处理问题解答
问题背景
正在完成超市薯片销售数据课程作业,需剔除非薯片类条目,运行给定R代码时出错。
运行代码
productWords <- data.table(unlist(strsplit(unique(transaction_data[, "PROD_NAME"]), "")))
数据文件为transaction_data,目标列是PROD_NAME。
报错信息
Error in strsplit(unique(transaction_data[, "PROD_NAME"]), "") : non-character argument
数据示例
DATE STORE_NBR LYLTY_CARD_NBR TXN_ID PROD_NBR PROD_NAME PROD_QTY TOT_SALES <date> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> 1 2018-10-17 1 1000 1 5 Natural Chip Compny SeaSalt175g 2 6 2 2019-05-14 1 1307 348 66 CCs Nacho Cheese 175g 3 6.3 3 2019-05-20 1 1343 383 61 Smiths Crinkle Cut Chips Chicken 170g 2 2.9
错误原因
- 类型不匹配:
strsplit要求第一个参数是纯字符向量,但transaction_data[, "PROD_NAME"]返回的是data.table的列对象,而非纯字符类型,unique()处理后仍未转换为字符向量,导致报错。 - 逻辑错误:原代码用
strsplit(..., "")把产品名称拆成单个字符,完全无法用于区分薯片和非薯片产品,逻辑方向错误。
解决方案
1. 修正原代码的类型问题(仅解决报错,不解决业务需求)
如果只是想让原代码运行,需先将列转换为字符向量:
prod_names <- as.character(transaction_data$PROD_NAME) productWords <- data.table(unlist(strsplit(unique(prod_names), "")))
2. 正确筛选薯片类条目(满足作业需求)
方法1:关键词模糊匹配
通过识别PROD_NAME中的薯片相关关键词(如品牌、产品术语)筛选:
# 匹配包含Chip/Chips/CCs的记录,忽略大小写 chip_data <- transaction_data[grepl("(Chip|Chips|CCs)", PROD_NAME, ignore.case = TRUE), ]
可根据实际产品补充更多关键词(比如其他薯片品牌)。
方法2:精准匹配已知产品列表
如果有已知的薯片产品清单,直接匹配:
# 示例薯片产品列表 chip_products <- c("Natural Chip Compny SeaSalt175g", "CCs Nacho Cheese 175g", "Smiths Crinkle Cut Chips Chicken 170g") # 筛选匹配记录 chip_data <- transaction_data[PROD_NAME %in% chip_products, ]
内容的提问来源于stack exchange,提问作者JackOrmston
相关产品推荐
相关产品推荐

