Apriori算法数据预处理报错:item_name列格式问题求解
解决Apriori算法中item_name列的格式适配问题
我来帮你搞定这个Apriori的格式报错问题,你遇到的两个错误本质都是数据结构没匹配上arules包的要求,咱们一步步拆解解决:
错误原因拆解
- 第一个报错
Error in asMethod(object) : column(s) 2 not logical or a factor这是因为
apriori()默认期待的是宽格式二元矩阵:每一列对应一个物品,用逻辑值(TRUE/FALSE)或因子标记该事务是否包含这个物品。但你的item_name列是列表类型(每个单元格存着多个物品的向量),完全不符合这个输入要求。 - 第二个报错
Error in min(x, na.rm = TRUE) : invalid 'type' (list) of argumentdiscretize()是用来给数值型数据做分箱的工具,而你的item_name是分类属性的列表数据,用这个函数属于找错了工具,肯定会报错。
正确的处理步骤
arules包最适配的是transactions类型的数据,我们需要把你的长格式数据集(transaction_id + 物品)转换成这种结构,有两种简单的实现方式:
方法1:直接用transactions()转换(适用于每行对应单个物品的长格式)
如果你的数据是一个transaction_id对应多行,每行存一个单独的item_name,直接用这个函数指定格式即可:
library(arules) # 将长格式数据转换为transactions对象 nz_trans <- transactions(nz.mb, format = "single", cols = c("transaction_id", "item_name"))
方法2:先整理为列表再转换(适用于每个单元格存多个物品的情况)
如果你的item_name列每个单元格已经是包含多个物品的向量(比如某行的item_name是c("a", "b", "c")),先按transaction_id分组整理成事务列表,再转换:
library(dplyr) library(arules) # 按交易ID分组,收集每个交易对应的所有物品 trans_list <- nz.mb %>% group_by(transaction_id) %>% summarise(items = list(item_name)) %>% pull(items) # 将列表转换为transactions对象 nz_trans <- as(trans_list, "transactions")
运行Apriori算法
用转换好的nz_trans来执行规则挖掘,就不会再出现类型错误了:
rules <- apriori(nz_trans, parameter = list(supp = 0.001, conf = 0.8))
内容的提问来源于stack exchange,提问作者Tim Heavey
相关产品推荐
相关产品推荐

