【问题标题】:Faster aggregate multiple columns更快地聚合多列
【发布时间】:2018-04-09 17:01:18
【问题描述】:

我有以下功能可以运行 100 次。这种聚合是我代码中的瓶颈。仅使用 data.table 或使用 rcpp 重写此函数是否可以更快?

  logit.gr <- function(DT){
    temp1 <- DT[, lapply(.SD, function(x) col1*sum(y*(x - sum(x*exp(col2))))), by = .(main_idx), .SDcols = c('col3','col4')]
    return(-colSums(temp1[, c('col3','col4'), with = F]))
  }

DT 在哪里

DT <- data.table(main_idx = c(rep('A',4), rep('B', 5)), col1 = runif(9), col2 = -2+runif(9), col3 = 1+runif(9), col4 = 1+runif(9), y = runif(9))

【问题讨论】:

  • 请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 谢谢。我刚刚做到了
  • 应该是col3*sum(y*(x - sum(x*exp(col4)))))而不是这个col1*sum(y*(x - sum(x*exp(col2)))))
  • 你在哪里使用theta在你的逻辑?
  • 我在这个函数中调用了另一个函数。我删除了它,因为它不是瓶颈。忘记删除 theta。

标签: r data.table aggregate


【解决方案1】:

我想优化的是:

  1. sum 应该添加到 lapply 本身使用的函数中。这将导致每个 main_idx 在结果 data.table 中只有 1 行。
  2. [ 运算符链应用于sumcol3col4
library(data.table)
DT[, lapply(.SD, function(x) sum(col1*sum(y*(x - sum(x*exp(col2)))))), 
   by = .(main_idx), .SDcols = c('col3','col4')][
         ,.(col3 = -sum(col3), col4 = -sum(col4))]
#Result
#     col3      col4 
#0.7575290 0.2423651 

数据:

DT <- data.table(main_idx = c(rep('A',4), rep('B', 5)), 
              col1 = runif(9), col2 = -2+runif(9), 
              col3 = 1+runif(9), col4 = 1+runif(9), y = runif(9))

【讨论】:

  • 我忘了提到我可能有动态列数要聚合(例如,现在我只有 col3、col4。我也可以有 col5、col6...)
  • 没关系。我可以使用 .SD 来做动态列数
  • 没关系。您只需要更改.SDcols。可能在第二个[ 运算符中,只需排除main_idx 并获得sum。无论如何,您都可以设置列名。
  • @deepAgrawal 完全正确。
  • 但是主要的计算仍然在 lapply 组中进行。有没有办法让它更快?
猜你喜欢
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2012-05-23
  • 2020-09-10
  • 1970-01-01
  • 2023-01-19
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多