提高 data.table 分组操作的效率

Improving efficiency of data.table grouped operations

提问人:nateroe 提问时间:11/16/2023 最后编辑:nateroe 更新时间:11/16/2023 访问量:55

问:

我需要对数据框中所有可能的行组合进行比较。尽管使用具有高效函数的 组操作,但当行组合数量较多(例如,数十万或更多)时,该操作需要很长时间。

下面是一个示例数据集:

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))

我首先创建一个包含所有可能的行组合的数据帧。然后我使用 .SD

# create dataframe of all row combinations
plot_combs <- data.table::data.table(t(combn(seq(nrow(my_df)), 2)))

# create grouped operations function
.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
}
# run and record system time for grouped operation
system.time(plot_combs[, .PLOT_COMP(.SD), by = seq(nrow(plot_combs))][,-1])

尽管函数本身需要 ~0 秒才能完成,但整个操作速度很慢。我希望能大大提高效率。.PLOT_COMP

关于如何提高这种操作的效率的任何想法?谢谢。

更新------------

根据 Gregor Thomas 的建议进行改进 -

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]])
  
})

此代码在 0.02 秒内运行,而不是超过一分钟。

Data.Table R 性能

评论


答: 暂无答案