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

R语言中summarise函数的高效替代方案求助

优化重复summarise操作的高效方案

你的代码性能瓶颈在于无意义的重复计算:循环10000次执行完全相同的聚合操作,但原始数据df在循环过程中没有任何修改,每次计算的结果完全一致,纯粹浪费计算资源。以下是针对性的优化方案:

核心优化:移除循环内的重复计算

直接将聚合操作移到循环外部,仅计算一次,后续循环直接复用结果即可,这能把时间复杂度从O(n*10000)降到O(n):

library(dplyr)

df <- data.frame(Letter = letters, Num = c(1 : (26*10) ))

# 仅执行一次聚合计算
df_sum_Tot <- summarise(df, Sum_Num = sum(Num))
df_sum_Letter <- summarise(df, Sum_Num = sum(Num), .by = Letter)

# 循环内直接复用已计算好的结果
for (x in 1:10000){
  # 这里执行你的业务逻辑,比如输出、写入等操作,无需重复计算聚合
}

进阶优化:换用更高效的聚合工具

如果你的实际场景中数据会在循环内更新,需要每次重新聚合,可以换用性能更优的工具替代dplyr:

1. 使用data.table

data.table的分组聚合底层实现更高效,适合大规模数据或高频聚合场景:

library(data.table)

dt <- as.data.table(df)

# 计算总合
dt_sum_Tot <- dt[, .(Sum_Num = sum(Num))]
# 按Letter分组聚合
dt_sum_Letter <- dt[, .(Sum_Num = sum(Num)), by = Letter]

2. 使用collapse包

collapse包专为高效数据操作设计,聚合速度远快于dplyr,语法简洁:

library(collapse)

# 计算总合
df_sum_Tot <- collap(df, Sum_Num = sum(Num))
# 按Letter分组聚合
df_sum_Letter <- collap(df, Sum_Num = sum(Num), by = "Letter")

额外优化建议

  • 避免在循环中频繁创建新变量,尽量复用已存在的对象
  • 如果是超大规模数据,考虑预先过滤不必要的列,减少计算量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:16:03