我正在尝试加速一些代码,这非常慢。首先,我有一个名为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程序员,我通常很难想象如何进行矢量化。有什么建议吗?
答案 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