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

时间:2018-09-27 01:25:02

标签: r data.table

我想计算R data.table与组均值的偏差。为了有效地做到这一点,我想在data.table中使用优化的mean函数,但是还没有找到在 composite 调用中使用该函数的方法(即{{1} })?

我的意思是我可以使用x - mean(x),但是我怀疑这种方法未在data.table中使用均值的优化版本。确实,比较以下速度:

  1. x[, lapply(.SD, function(x) x - mean(x)), by=id]
  2. x[, lapply(.SD, mean), by=id]

事实证明,在某些情况下1)比2)快10倍!因此,如何使用类似1)的调用,但是这次要使用类似x[, lapply(.SD, function(x) mean(x)), by=id]的复合函数呢?在x -mean(x)中使用匿名呼叫{...}失败。

谢谢!

模拟显示lapplymean的速度更快:

function(x) mean(x)

结果:

library(data.table)

T = 50 
N = 20000
set.seed(123)
data_sim <- data.table(A = rnorm(N * T),
                       B1 = sample(c(0,1), N * T, replace = TRUE),
                       B2 = rnorm(N * T),
                       individual = rep(1:N, each = T))

library(microbenchmark)

mean2 <- function(x) mean(x)

microbenchmark(sol1 = data_sim[, lapply(.SD, mean), by=individual],
               sol2 = data_sim[, lapply(.SD, mean2), by=individual],
               sol3 = data_sim[, lapply(.SD, function(x) mean(x)), by=individual],
               dev_mean = data_sim[, lapply(.SD, function(x) x- mean(x)), by=individual],

1 个答案:

答案 0 :(得分:1)

当前,mean不能使用按分组?GForce进行优化(请参阅:=),尽管it has been proposed无法使用。

一旦可用,DT[, mu := mean(x), by=g][, v := x - mu]之类的东西就应该起作用(将lapplyMap应用于多个列时)。

同时,

可能会有所提高
mDT = DT[, .(mu = mean(x)), by=g]
DT[mDT, on=.(g), mu := i.mu]
DT[, v := x - mu]

...尽管我不确定,因为这涉及两个分组操作。