在R中生成品类组合频率占比矩阵的技术问题咨询
解决方案
要生成你需要的品类共现占比矩阵,核心思路是先统计每个交易包含的品类集合,再计算每个品类的交易总数,最后基于共现交易数除以对应品类的交易总数得到占比。以下是具体实现步骤:
1. 预处理数据
首先把你用cbind生成的矩阵转成数据框,方便后续dplyr操作:
trxn_num = c(1,2,3,3,3,4,5,5,6,7,7,7,7) categories = c("pants","boots","boots","shirts","socks","pants","pants","socks", "shorts", "pants", "socks","boots","shirts") # 转成数据框(cbind生成的是矩阵,不适合后续分组操作) df <- data.frame(trxn_num = trxn_num, categories = categories)
2. 提取每个交易的品类集合
按交易编号分组,把每个交易里的所有品类存为列表,这样能快速判断两个品类是否在同一交易中共现:
library(dplyr) # 按交易分组,提取每个交易的唯一品类列表 trxn_cats <- df %>% group_by(trxn_num) %>% summarize(cats = list(unique(categories))) %>% ungroup()
3. 计算每个品类的交易总数
统计每个品类出现在多少个不同交易里,这是后续计算占比的分母:
all_cats <- unique(df$categories) # 计算每个品类对应的交易总数 total_trxn <- sapply(all_cats, function(cat) { sum(sapply(trxn_cats$cats, function(x) cat %in% x)) })
4. 生成共现占比矩阵
用outer函数遍历所有品类组合,计算共现交易数占该品类总交易数的比例,最后设置行列名并确保对角线为1:
# 生成共现矩阵 cooccur_mat <- outer(all_cats, all_cats, function(row_cat, col_cat) { # 统计同时包含row_cat和col_cat的交易数 co_count <- sum(sapply(trxn_cats$cats, function(x) row_cat %in% x & col_cat %in% x)) # 计算占比 co_count / total_trxn[row_cat] }) # 设置行列名称 rownames(cooccur_mat) <- all_cats colnames(cooccur_mat) <- all_cats # 确保对角线值为1(实际计算中已经是1,这里是冗余校验) diag(cooccur_mat) <- 1.0
运行后得到的cooccur_mat就是你需要的矩阵,比如cooccur_mat["pants", "socks"]代表购买pants的交易中同时购买socks的比例。
为什么直接按category分组不行?
你之前尝试用dplyr直接按categories分组时失败,是因为这种分组方式只能拿到单个品类的交易信息,无法关联到同一交易里的其他品类。必须先按交易编号分组,拿到每个交易的完整品类集合,才能计算不同品类间的共现关系。
内容的提问来源于stack exchange,提问作者Greg Brown
相关产品推荐
相关产品推荐

