如何提升data.table分组运算效率?(大规模行组合场景)
优化行组合成对运算的效率问题
我需要对数据框中所有行的两两组合进行运算对比。虽然用了data.table分组配合自定义函数,但当行组合数达到数十万级时,整体运行速度慢得离谱。
示例数据集代码
set.seed(23) my_df <- matrix(data = rnorm(6000, mean = 100, sd = 10), nrow = 200, ncol = 30) my_df <- data.table::data.table(as.data.frame(my_df))
初始实现步骤
- 创建包含所有行组合的data.table:
plot_combs <- data.table::data.table(t(combn(seq(nrow(my_df)), 2))) - 定义分组运算函数:
.PLOT_COMP <- function(x){ .sd_my_df <- my_df[as.numeric(i),] outer(t(as.matrix(.sd_my_df[1, ])), t(as.matrix(.sd_my_df[2, ])), pmin) * 2 } - 执行并计时:
system.time(plot_combs[, .PLOT_COMP(.SD), by = seq(nrow(plot_combs))][,-1])
问题点
单个.PLOT_COMP函数执行几乎瞬间完成,但整体批量运算却耗时极长,急需大幅提升效率。
已完成的优化
基于Gregor Thomas的建议优化后,运行时间从原来的超一分钟降到了0.02秒,优化后的代码如下:
my_df <- t(matrix(data = rnorm(6000, mean = 100, sd = 10), nrow = 200, ncol = 30)) plot_combs_m <- combn(seq(nrow(my_df)), 2) system.time(for(i in seq(nrow(plot_combs_m))){ my_plots <- plot_combs_m[,i] outer(my_df[,my_plots[1]], my_df[,my_plots[2]]) })
寻求进一步优化方案
现希望找到能进一步提升该运算效率的方法。
内容的提问来源于stack exchange,提问作者nateroe
相关产品推荐
相关产品推荐

