对于每个因子水平,我需要提取除当前数据框之外的所有子集聚合值。例如,有几个学科在多天内完成反应时间任务,我需要计算所有学科和所有天数的平均反应时间,但不包括计算平均值的学科。目前,我这样做:
library(lme4)
ddply(sleepstudy, .(Subject, Days), summarise,
avg_rt = mean(sleepstudy[sleepstudy$Subject != Subject &
sleepstudy$Days == Days,"Reaction"]), .progress="text")
对于小数据集,它可以正常工作,但对于大数据集,速度可能非常慢。有没有更快的方法?
dt[,sn:=.N,by=c("Subject","Days")]; dt[,s_avg_rt:=ifelse(sn==1,Reaction,.SD[,sum(Reaction)]),by=c("Subject","Days")]; dt[,avg_rt1:=(avg_rt*n-s_avg_rt)/(n-sn)];
- Andrey Chetverikovj
中可以进行自连接,例如:DT[,DT[.BY,...],by=...]
。作用域可能会有些棘手(在哪个部分内的 by 列引用哪个DT
?),因此.BY
对于这一点非常有用。尚未实现不连接(DT[-J(...)]
),但是长手动DT[-DT[J(...),which=TRUE]
仍然比向量扫描!=
更好。所以,非常丑陋,但也许是DT[,DT[-DT[.BY,which=TRUE]],by=...]
。然而,首先进行聚合步骤通常比从每个组进行连接要快得多。 - Matt Dowle.I
也可能对此有用(一旦实现),例如DT[,DT[-.I],by=...]
。 - Matt Dowle.I
。不过首先得处理好这19个未解决的bug报告。 - Matt Dowle