多品牌购买组合统计问题:代码报错与优化需求
品牌两两组合购买次数计算:报错排查与高效实现
一、报错原因拆解
- 列名/语法问题:报错提示
HHKEY, Brand not found,要么是你的dt_grouped实际列名是HHKEY而非代码里写的ID,要么是dt_grouped是dplyr生成的分组tibble——这种对象不支持data.table的[行,列]索引语法,得先转成data.table或用dplyr语法取数。 - 逻辑偏离需求:就算报错解决,你当前代码是把一个用户的所有品牌拼成一串,根本没生成两两组合,和目标结果完全不符。
二、高效实现方案(data.table版,速度最优)
1. 基础数据汇总
先把数据转成data.table格式,按用户和品牌汇总购买次数:
library(data.table) dt <- as.data.table(dt) # 得到每个用户-品牌的总购买量 dt_grouped <- dt[, .(nr_purchases = sum(nr_products_bought)), by = .(ID, Brand)]
2. 生成两两品牌组合并计算总和
用自连接+过滤实现向量化操作,彻底抛弃低效循环:
# 自连接获取同一用户下的所有品牌对,用Brand < i.Brand避免重复组合(比如Brand1-Brand2只保留一次) dt_pairs <- dt_grouped[dt_grouped, on = .(ID), allow.cartesian = TRUE][Brand < i.Brand] # 计算每个品牌组合的总购买次数 dt_result <- dt_pairs[, .(total_purchases = nr_purchases + i.nr_purchases), by = .(ID, Brand_pair = paste(Brand, i.Brand, sep = ", "))]
三、dplyr替代方案
如果习惯用tidyverse语法,可参考以下实现:
library(dplyr) dt_grouped <- dt %>% group_by(ID, Brand) %>% summarise(nr_purchases = sum(nr_products_bought), .groups = "drop") dt_result <- dt_grouped %>% inner_join(dt_grouped, by = "ID") %>% filter(Brand.x < Brand.y) %>% mutate(Brand_pair = paste(Brand.x, Brand.y, sep = ", ")) %>% group_by(ID, Brand_pair) %>% summarise(total_purchases = nr_purchases.x + nr_purchases.y, .groups = "drop")
内容的提问来源于stack exchange,提问作者Fendi
相关产品推荐
相关产品推荐

