我目前正在使用 arules 包来执行市场篮分析。我读取的数据如下所示(但还有更多行):
>data
transaction_id item
1 1 beer
2 1 beer
3 1 soda
4 2 beer
5 3 beer
6 3 fries
7 3 candy
8 4 soda
9 4 fries
然后我使用 dcast 转换它并删除事务 id 列:
> Trans_Table <- dcast(data, transaction_id ~ item)
> Trans_Table$transaction_id <- NULL
它看起来像这样:
beer candy fries soda
1 2 0 0 1
2 1 0 0 0
3 1 1 1 0
4 0 0 1 1
但是当我把它变成"事务"类以便我可以使用先验函数时,它会将啤酒下的 2 转换为 1
> Transactions <- as(as.matrix(Trans_Table), "transactions")
Warning message:
In asMethod(object) :
matrix contains values other than 0 and 1! Setting all entries != 0 to 1.
有没有办法执行市场篮子分析并保持该 2?换句话说,我希望看到{啤酒}=>{啤酒},{啤酒,啤酒}=>{苏打水}和{啤酒,苏打水}=>{啤酒}的规则,但目前每笔交易也只计算一次啤酒,即使购买了两次。
谁能帮忙解决这个问题?
市场篮分析是查看一起购买的不同项目,而不是给定项目的频率。但是,如果您确实希望将同一项视为不同的项,则可以使用以下方法来生成新的项名称。
使用库dplyr
,您可以改变要附加的项名称,以附加它发生次数的 id,并在您的规则处理中使用它:
library(dplyr)
df <- df %>%
group_by(transaction_id, item) %>%
mutate(newitem = paste(item, row_number(), sep = ''))
as.matrix(table(df$transaction_id, df$newitem))
输出为:
beer1 beer2 candy1 fries1 soda1
1 1 1 0 0 1
2 1 0 0 0 0
3 1 0 1 1 0
4 0 0 0 1 1
也有几种方法可以调整输出以适应特定的格式样式。