如何高效计算各order_id对应的basket size并写入原数据表
现有实现的问题
- 匹配逻辑完全错误:你写的
if (data5$order_id[i] != vec$Var1[j])判断条件完全写反,应该是两个id相等的时候才对应赋值,而且内层循环没有跳出逻辑,每行会被反复覆盖赋值,最终只会保留循环到最后一个j时的匹配结果,自然计算结果全部错误。 - 执行效率极低:双层循环的时间复杂度是O(原表行数 * 唯一订单数),数据量过万之后运行耗时会指数级上升,完全不适合结构化数据的分组计算场景。
- 统计逻辑不符合需求:你需求明确说明basket size是同一个order_id下
product_number_within_order字段的最大值,你当前用order_id出现次数统计的逻辑,仅在product_number_within_order连续无缺失时结果一致,一旦存在商品记录删除、序号跳变的场景,统计结果就会出错。
高效实现方案
R本身已经内置了大量优化过的分组计算函数,不需要手动写循环匹配,以下三种方案都可以快速完成需求,效率比双层循环高数百倍:
基础R实现(无需安装第三方包)
# 按order_id分组,取每组product_number_within_order的最大值作为basket size data5$basketsize <- ave(data5$product_number_within_order, data5$order_id, FUN = max)
如果确认要按订单记录数统计basket size,把上述代码的FUN = max换成FUN = length即可。
dplyr实现(适合tidyverse技术栈用户)
library(dplyr) data5 <- data5 %>% group_by(order_id) %>% mutate(basketsize = max(product_number_within_order)) %>% ungroup()
data.table实现(适合百万级以上大数据量场景,速度最快)
library(data.table) # 转换为data.table格式 setDT(data5) # 分组计算并直接新增字段 data5[, basketsize := max(product_number_within_order), by = order_id]
内容的提问来源于stack exchange,提问作者Estelle
相关产品推荐
相关产品推荐

