首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更快的聚合多列

更快的聚合多列
EN

Stack Overflow用户
提问于 2018-04-09 17:01:18
回答 1查看 178关注 0票数 1

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

代码语言:javascript
运行
复制
  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在哪里

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 18:09:49

我认为优化的目的是:

  1. 应该在sum本身使用的函数中添加lapply。在结果的main_idx中,它将导致每个data.table只有1行。
  2. [操作符链应用于sumcol3col4
代码语言:javascript
运行
复制
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 

数据:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49738044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档