在循环中加速R过滤

问题描述 投票:0回答:1

我正在运行一个针对~1m记录的脚本,该记录在数据集中每天获得一个聚合并将其绑定到一个完整的数据集,这需要很长时间。每个循环中90%的时间都花在filter()部分中。

有什么方法可以加快速度吗?

for (i in seq_along(date_range)){    
  todays_results <- state_change %>% filter(state_date <= date_range[i] & date_range[i] <= next_state_dt)
  todays_results <- todays_results %>% group_by(state_date, marketing_category) %>% count()

  daily_state_counts <- rbind(daily_state_counts, todays_results)  
}

这是一个数据样本

 contact_id      state_date marketing_category next_state_dt next_mc  
   <fct>           <date>     <fct>              <date>        <fct>    
 1 003U000000Dyl6Z 2014-01-07 dormant            NA            NA       
 2 003U000000DylwT 2014-01-07 dormant            NA            NA       
 3 0030P00001ypDpt 2014-01-07 dormant            2014-02-12    recruiter
 4 0030P00001ypFZW 2014-01-07 dormant            2014-07-30    recruiter
 5 003U000000Io07V 2014-01-07 dormant            2017-02-13    recruiter
 6 0030P00001ypE7S 2014-01-07 recruiter          2015-07-08    dormant  
 7 0030P00001yOP1K 2014-01-07 dormant            2014-05-15    recruiter
 8 003U000000LNi2C 2014-01-07 dormant            NA            NA       
 9 003U000000DyjAb 2014-01-07 dormant            2014-11-20    recruiter
10 003U000001Z6yb6 2014-01-07 dormant            2016-01-15    recruiter
11 003U000000Oc9xR 2014-01-07 dormant            2015-10-21    inactive
r optimization
1个回答
1
投票

避免生长物体的简单方法是使用lapply()然后使用do.call()

尝试

lapply(seq_along(date_range), function(i) {    
  state_change %>% 
    filter(state_date <= date_range[i] & date_range[i] <= next_state_dt) %>% 
    group_by(state_date, marketing_category) %>% 
    count()
}) %>%
  do.call("rbind", .)
© www.soinside.com 2019 - 2024. All rights reserved.