You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:11