我想计算R data.table
与组均值的偏差。为了有效地做到这一点,我想在data.table中使用优化的mean
函数,但是还没有找到在 composite 调用中使用该函数的方法(即{{1} })?
我的意思是我可以使用x - mean(x)
,但是我怀疑这种方法未在data.table中使用均值的优化版本。确实,比较以下速度:
x[, lapply(.SD, function(x) x - mean(x)), by=id]
x[, lapply(.SD, mean), by=id]
事实证明,在某些情况下1)比2)快10倍!因此,如何使用类似1)的调用,但是这次要使用类似x[, lapply(.SD, function(x) mean(x)), by=id]
的复合函数呢?在x -mean(x)
中使用匿名呼叫{...}
失败。
谢谢!
lapply
与mean
的速度更快: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],
答案 0 :(得分:1)
当前,mean
不能使用按分组?GForce
进行优化(请参阅:=
),尽管it has been proposed无法使用。
一旦可用,DT[, mu := mean(x), by=g][, v := x - mu]
之类的东西就应该起作用(将lapply
和Map
应用于多个列时)。
同时,
可能会有所提高mDT = DT[, .(mu = mean(x)), by=g]
DT[mDT, on=.(g), mu := i.mu]
DT[, v := x - mu]
...尽管我不确定,因为这涉及两个分组操作。