提问人:nateroe 提问时间:11/16/2023 最后编辑:nateroe 更新时间:11/16/2023 访问量:55
提高 data.table 分组操作的效率
Improving efficiency of data.table grouped operations
问:
我需要对数据框中所有可能的行组合进行比较。尽管使用具有高效函数的 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 使用 ..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 秒内运行,而不是超过一分钟。
答: 暂无答案
评论