R data.table:在复合调用中使用优化的mean()函数?
我想在RR data.table:在复合调用中使用优化的mean()函数?,r,data.table,R,Data.table,我想在R数据表中计算与组平均值的偏差。为了有效地实现这一点,我想在data.table中使用优化的mean函数,但还没有找到在复合调用中使用它的方法(即x-mean(x)) 我的意思是,我可以使用x[,lapply(.SD,函数(x)x-mean(x)),by=id],但我怀疑这种方法没有使用data.table中的优化平均值。事实上,比较以下各项的速度: x[,lapply(.SD,mean),by=id] x[,lapply(.SD,函数(x)均值(x)),by=id] 事实证明,在某些情况
数据表中计算与组平均值的偏差。为了有效地实现这一点,我想在data.table中使用优化的mean
函数,但还没有找到在复合调用中使用它的方法(即x-mean(x)
)
我的意思是,我可以使用x[,lapply(.SD,函数(x)x-mean(x)),by=id]
,但我怀疑这种方法没有使用data.table中的优化平均值。事实上,比较以下各项的速度:
x[,lapply(.SD,mean),by=id]
x[,lapply(.SD,函数(x)均值(x)),by=id]
事实证明,在某些情况下1)比2)快10倍!那么,我如何使用像1)中那样的调用,但这次使用的是像x-mean(x)
这样的复合函数?我在lappy
中使用匿名调用{…}
未成功
谢谢
模拟显示平均值
相对于函数(x)平均值(x)
的速度:
目前,按组平均值优化(请参见?GForce
)不适用于:=
一旦可用,类似于DT[,mu:=mean(x),by=g][,v:=x-mu]
的东西应该可以工作(在应用于多个列时插入lappy
和Map
)
在此期间,可能会有一些加速
mDT = DT[, .(mu = mean(x)), by=g]
DT[mDT, on=.(g), mu := i.mu]
DT[, v := x - mu]
。。。虽然我不确定,因为这涉及到两组操作。请参见?GForce
并打开verbose=TRUE
Chinsoon的评论解释了为什么会出现速度差异,但我不知道如何将其应用于此问题。我认为如果完成了,它可能会像DT[,mu:=mean(x),by=g][,v:=x-mu]
(除了使用lappy和Map在列上迭代),但是平均值还没有用:=
优化。感谢@chinsoon12提供的verbose=TRUE
参数,它解释了速度差异!但事实上,我不知道如何在我的环境中应用?我认为,根据@Frank的说法,使用优化平均值来解决我的问题几乎没有希望?然后解决方案似乎是计算组平均值表(使用gforce),并将其绑定回原始表!?这就解释了为什么这个解决方案如此有效@弗兰克,你想写下你的评论作为回答吗?我想你得到了正确的答案,那是不可能的。
|expr | min| mean| max| neval|
|:--------|---------:|---------:|---------:|-----:|
|sol1 | 17.67686| 18.68033| 21.04078| 5|
|sol2 | 369.69595| 378.91943| 400.77024| 5|
|sol3 | 149.57088| 154.76857| 159.93155| 5|
|dev_mean | 218.44641| 286.00977| 404.06092| 5|
mDT = DT[, .(mu = mean(x)), by=g]
DT[mDT, on=.(g), mu := i.mu]
DT[, v := x - mu]