R语言中如何按交易分组构建适配Apriori分析的0-1编码新数据框
R中实现长格式交易明细转Apriori适用的0/1编码宽表方法
本次需要处理的是逐行记录单商品的长交易表,目标是转换为**每行对应1笔独立交易、每列对应1类商品、单元格取值为0/1(1代表该交易购买了对应商品,0代表未购买)**的结构,完全适配Apriori关联分析的输入要求,以下是3种可落地的实现方案:
方案1:arules包原生事务格式转换(最适配关联分析场景)
这是针对关联分析设计的专用转换逻辑,自动处理同交易下的重复商品记录,生成的事务对象可直接传入Apriori算法,无需二次调整:
# 加载关联分析专用工具包 library(arules) # 读入dput格式的示例交易数据 trans_df <- structure(list(Transaction = c(1L, 2L, 2L, 3L, 3L, 3L), Item = c("Bread", "Scandinavian", "Scandinavian", "Hot chocolate", "Jam", "Cookies" ), date_time = c("30/10/2016 09:58", "30/10/2016 10:05", "30/10/2016 10:05", "30/10/2016 10:07", "30/10/2016 10:07", "30/10/2016 10:07"), period_day = c("morning", "morning", "morning", "morning", "morning", "morning"), weekday_weekend = c("weekend", "weekend", "weekend", "weekend", "weekend", "weekend"), Year = c("2016", "2016", "2016", "2016", "2016", "2016"), Month = c("October", "October", "October", "October", "October", "October")), row.names = c(NA, 6L), class = "data.frame") # 基于交易ID、商品列生成标准事务对象 txn <- transactions( eval = list( Transaction = trans_df$Transaction, Item = trans_df$Item ) ) # 如需导出为普通0/1数据框,执行以下转换: binary_df <- as.data.frame(as(txn, "matrix") * 1)
注意:该方法会自动去重同交易下的重复商品记录,比如示例中交易2两次记录购买Scandinavian,最终只会在对应列记为1,不会出现重复计数为2的情况。
方案2:tidyverse管道操作转换(灵活度高)
适合需要在转换过程中同步加入字段筛选、清洗逻辑的场景,手动构建0/1编码的宽表:
library(tidyverse) binary_df <- trans_df %>% # 按交易ID、商品分组,自动去重同交易下的重复商品记录 count(Transaction, Item, name = "purchase_flag") %>% # 将商品列展开为独立的0/1编码列 pivot_wider( names_from = Item, values_from = purchase_flag, values_fill = 0 )
方案3:基础R内置函数转换(无额外包依赖)
如果不想安装第三方包,可直接用基础R的列联表功能实现转换:
# 生成交易-商品列联表 txn_crosstab <- table(trans_df$Transaction, trans_df$Item) # 将所有购买记录(值>0)统一转成1,未购买补0 binary_df <- as.data.frame.matrix(1 * (txn_crosstab > 0))
转换结果说明
生成的编码表结构完全匹配需求:
- 行维度为唯一交易ID(1、2、3…)
- 列维度为所有出现过的商品类别(Bread、Scandinavian、Hot chocolate、Jam、Cookies)
- 单元格取值仅为0或1,直接适配Apriori算法的输入格式要求
内容的提问来源于stack exchange,提问作者elliotjameees
相关产品推荐
相关产品推荐

