R data.table:在复合调用中使用优化的mean()函数?

R 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] 事实证明,在某些情况

我想在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]
  • 事实证明,在某些情况下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]