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

如何高效计算水果篮数据集里水果的共现/一致性比例?

高效计算水果共现/一致性比例的data.table方案

基于你的水果篮子数据集,以下是替代手动创建二进制列的高效方案,全程使用data.table处理,适配大规模数据场景:

步骤1:将宽格式数据集转为长格式

先把每个篮子的3种水果拆分成单独行,同时保留篮子ID用于后续分组:

library(data.table)
baskets <- data.table(fruit_1 = c('orange', 'apple', 'apple', 'pear')
                      ,fruit_2 = c('apple', 'pear', 'kiwi', 'kiwi')
                      ,fruit_3 = c('pear', 'kiwi', 'blueberry', 'blueberry'))

# 转长格式,生成篮子-水果对
baskets_long <- baskets[, .(fruit = unlist(.SD)), by = .(basket_id = 1:nrow(baskets))]

步骤2:生成水果二进制宽表

用dcast快速生成每行对应篮子、每列对应水果的二进制矩阵(1表示水果在篮子中,0表示不在):

# 生成二进制宽表,自动处理所有水果种类
baskets_wide <- dcast(baskets_long, basket_id ~ fruit, fun.aggregate = length, fill = 0)
# 移除basket_id列,仅保留水果列用于计算
fruit_matrix <- baskets_wide[, !"basket_id"]

步骤3:计算水果对的共现与一致性指标

3.1 计算共现次数矩阵

利用tcrossprod快速计算每对水果的同时出现次数(二进制矩阵的交叉乘积即为共现次数):

# 生成共现次数矩阵
cooccur_matrix <- tcrossprod(as.matrix(fruit_matrix))
# 转换为data.table并转成长格式的水果对
cooccur_dt <- as.data.table(cooccur_matrix, keep.rownames = "fruit_1")
cooccur_pairs <- melt(cooccur_dt, id.vars = "fruit_1", variable.name = "fruit_2", value.name = "cooccur_count")

3.2 过滤唯一无序对

移除重复配对(如apple-pear和pear-apple视为同一对)及自身配对:

cooccur_pairs <- cooccur_pairs[fruit_1 < fruit_2]

3.3 计算比例类指标

先统计总篮子数和各水果的出现次数,再计算共现频率、Jaccard一致性比例等:

total_baskets <- nrow(baskets)
# 统计每种水果的出现次数
fruit_counts_dt <- data.table(fruit = colnames(fruit_matrix), count = colSums(fruit_matrix))

# 合并水果出现次数到共现对表中
cooccur_pairs <- cooccur_pairs[fruit_counts_dt, on = .(fruit_1 = fruit), count_1 := count]
cooccur_pairs <- cooccur_pairs[fruit_counts_dt, on = .(fruit_2 = fruit), count_2 := count]

# 计算共现频率:共现次数/总篮子数
cooccur_pairs[, cooccur_freq := cooccur_count / total_baskets]

# 计算Jaccard一致性比例:共现次数/(A出现次数+B出现次数-共现次数)
cooccur_pairs[, jaccard := cooccur_count / (count_1 + count_2 - cooccur_count)]

可选:计算相关性指标

如果需要你示例中的相关性得分,可直接对二进制矩阵计算相关系数并转成水果对格式:

cor_matrix <- cor(fruit_matrix)
cor_dt <- as.data.table(cor_matrix, keep.rownames = "fruit_1")
cor_pairs <- melt(cor_dt, id.vars = "fruit_1", variable.name = "fruit_2", value.name = "similarity")
cor_pairs <- cor_pairs[fruit_1 < fruit_2]

方案优势

  • 自动化处理所有水果种类,无需手动创建二进制列,适配水果数量多的场景
  • 采用dcast、tcrossprod等高效向量/矩阵操作,性能远优于手动循环赋值,适合数千行以上的大规模数据
  • 可灵活扩展计算多种一致性指标,满足不同分析需求

内容的提问来源于stack exchange,提问作者Sam Asin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:13:28