Быстрее агрегировать несколько столбцов

У меня есть следующая функция, которая запускается сотни раз. Эта агрегация является узким местом в моем коде. Можно ли сделать это быстрее с помощью 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))

1 ответ

Решение

Я думаю, что для оптимизации это:

  1. sum следует добавить в функцию, используемую в lapply сам. Это приведет только к 1 строке за main_idx в результате data.table,
  2. цепь [ оператор должен быть использован для sum столбцы col3 а также col4,
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))
Другие вопросы по тегам