加速嵌套在R中的循环

时间:2015-12-11 17:45:26

标签: r for-loop vectorization

我正在尝试加速一些代码,这非常慢。首先,我有一个名为raw的数据结构,我将粘贴下面的一个子集(它非常大 - 3045162次观察)。

对于t_trialNum和t_subjNum的每个组合,我试图从RIGHT_IN_SACCADE变量从0变为1的第一个点开始计算(1,2,3,4,5,6)。我已经使用嵌套for循环完成了这个任务:

subjlist <- unique(raw$t_subjNum)
triallist <- unique(raw$t_trialNum)
raw$saccindex <- 0
raw$aftersaccade <- 0
for(s in subjlist){
   for(t in triallist){
      index <- which(raw$t_subjNum == s & raw$t_trialNum == t)
      raw$aftersaccade[index] <- cumsum(raw$RIGHT_IN_SACCADE[index])
      raw$aftersaccade[index] <- ifelse(raw$aftersaccade[index] > 1, 1, 0)
      raw$saccindex[index]<- cumsum(raw$aftersaccade[index])
   }
   print(s)
}

作为一名C程序员,我通常很难想象如何进行矢量化。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

对于基数R,当面对一个向量的组内计算时,我通常会达到ave

raw$saccindex <- with( raw, 
      ave(RIGHT_IN_SACCADE,  interaction( t_subjNum, t_trialNum), # 2nd arg is grp-vec
                           FUN= function(x) cumsum( cumsum(x) > 1 ) )) 

答案 1 :(得分:1)

通过代码阅读,我认为这就是您想要的,使用begin transaction; insert into test (name) values ('voda'); update test set name = concat('voda', id) where id = 1; commit;

dplyr

对于主题和试用版的每个组合,我们会得到library(dplyr) raw %>% group_by(t_subjNum, t_trialNum) %>% mutate(aftersaccade = +(cumsum(RIGHT_IN_SACCADE) > 1), saccindex = cumsum(aftersaccade)) 列,其为1或0,具体取决于aftersaccade的cumsum是否为&gt; 1。

然后我们得到一个saccindex,它是RIGHT_IN_SACCADE

cumsum