如何高效计算水果篮数据集里水果的共现/一致性比例?
高效计算水果共现/一致性比例的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
相关产品推荐
相关产品推荐

