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

如何优化R代码以提升两个数据框客户购买记录拼接的运行速度

核心问题说明

原有双层for循环的时间复杂度为O(80万*30万),属于完全可避免的低效实现,无需逐行匹配,直接对B按ID做分组聚合拼接后再和A合并即可,耗时可从小时级降到秒级。


方案1:R原生实现(无需额外安装包)

无需安装第三方包,仅用R内置函数即可实现,处理你的数据量耗时约10秒内:

# 对B按ID分组,拼接同ID下的所有购买记录
B_agg <- aggregate(Purchase ~ ID, data = B, FUN = function(x) paste(x, collapse = ";"))
# 匹配A的ID,将B的聚合结果追加到A的Purchases列
match_idx <- match(A$ID, B_agg$ID)
A$Purchases <- ifelse(is.na(match_idx), 
                      A$Purchases, 
                      paste(A$Purchases, B_agg$Purchase[match_idx], sep = ";"))

方案2:data.table实现(性能最优,适合大数据量)

data.table是R针对大数据场景优化的包,分组、合并操作都做了底层C级优化,你的数据量用这个方案耗时约2秒内:

library(data.table)
# 转换为data.table格式(无额外拷贝开销)
setDT(A)
setDT(B)
# 对B按ID分组拼接
B_agg <- B[, .(Purchase_agg = paste(Purchase, collapse = ";")), by = ID]
# 左连接直接更新A的Purchases列
A[B_agg, on = .(ID), Purchases := paste(Purchases, i.Purchase_agg, sep = ";")]
# 如果不需要保留A原本的Purchases值,直接替换的代码更简单:
# A[B_agg, on = .(ID), Purchases := i.Purchase_agg]

方案3:dplyr实现(语法友好易读)

如果你习惯tidyverse生态的语法,可使用dplyr实现,耗时约3-5秒:

library(dplyr)
B_agg <- B %>%
  group_by(ID) %>%
  summarise(Purchase_agg = paste(Purchase, collapse = ";"))
A <- A %>%
  left_join(B_agg, by = "ID") %>%
  mutate(Purchases = ifelse(is.na(Purchase_agg), Purchases, paste(Purchases, Purchase_agg, sep = ";"))) %>%
  select(ID, Purchases)

所有方案都把时间复杂度降到了O(n+m),相比原有实现性能提升千倍以上,同时天然处理了A中ID在B中无匹配的边界场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:57:03