如何在R中转换数据集以适配购物篮分析的二元格式?
在R中将交易数据转换为购物篮分析格式
这里提供两种实用的方法来完成转换,分别适配通用数据处理场景和专业购物篮分析场景:
方法一:使用tidyverse工具包(通用数据处理)
适合习惯用dplyr/tidyr做数据转换的场景,步骤直观易上手:
- 加载所需工具包:
library(dplyr) library(tidyr) library(stringr) # 可选,用于清洗产品描述
- 预处理数据(推荐执行):
- 移除缺失值
- 统一产品描述格式(大小写、空格)
- 去重同一交易内的重复产品(购物篮只关心是否存在,不关心购买次数)
# 假设原始数据框名为df df_clean <- df %>% filter(!is.na(InvoiceNo), !is.na(Description)) %>% mutate(Description = str_to_lower(str_trim(Description))) %>% distinct(InvoiceNo, Description)
- 转换为宽格式二元矩阵:
basket_df <- df_clean %>% pivot_wider( names_from = Description, # 产品名称作为列名 values_from = Description, # 基于产品列生成标记值 values_fn = ~1, # 产品存在则标记为1 values_fill = 0 # 产品不存在则填充0 )
转换完成后,每行对应一个InvoiceNo,每列对应一个产品,单元格的1/0分别代表该交易是否包含对应产品。
方法二:使用arules包(专业购物篮分析)
arules是专门用于关联规则挖掘的工具包,其transactions对象是购物篮分析的标准格式,后续可直接用于Apriori等算法:
- 加载包并完成数据转换:
library(arules) # 先执行和方法一一致的预处理步骤 df_clean <- df %>% filter(!is.na(InvoiceNo), !is.na(Description)) %>% mutate(Description = str_to_lower(str_trim(Description))) %>% distinct(InvoiceNo, Description) # 转换为transactions专用对象 transactions <- as(df_clean, "transactions") # 若需要转换为普通二元矩阵格式: basket_matrix <- as(transactions, "matrix")
transactions对象自带购物篮分析的专属属性,执行summary(transactions)即可查看交易数量、产品数量等核心信息。
关键注意点
- 确保
InvoiceNo为字符或因子类型,避免被R误判为数值(比如带字母的交易编号) - 同一交易内的重复产品必须去重,否则会导致标记逻辑错误
- 产品描述的一致性很关键,比如"Apple"和"apple"会被识别为两个不同产品,预处理时统一格式是必要的
内容的提问来源于stack exchange,提问作者Aldo Verdino
相关产品推荐
相关产品推荐

