在R中的bigmemory中按组从变量中减去平均值

Subtract mean from a variable by group in bigmemory in R

我想贬低big.matrix(面板)结构中的变量。我尝试了不同的方法,但在 bigmemory 设置中工作的方法是 tapply(由 bigtabulate 包提供)。我有以下代码来计算由 panel_id

代表的组的变量 var1 的平均值
data <- read.big.matrix ("data.csv", sep = ",", header=TRUE, type = "double", backingfile = "backing.bin" , descriptor = "data.desc")
xdesc <- dget ("data.desc")
data <- attach.big.matrix(xdesc)

mean_var1=tapply(data[,"var1"], data[,"panel_id"], mean, na.rm=TRUE)

由于var1的长度与mean_var1的长度不同,我不能简单地减去另一个来贬低变量。您知道如何从 var1 的每个观察值中减去其组均值吗?

最简单的方法可能是使用 bigsplit 函数和 for 循环进行就地修改。

idx <- bigsplit(data, 1)

for(i in seq(length(idx))){
    data[idx[[i]],2] <- data[idx[[i]],2] - mean_var1[i]
}

看起来你会想要前者,但如果你想要返回一个合理大小的子集(即不超过 RAM),那么你可以使用 lapply 或者甚至探索一些与 foreach 的并行化

# use lapply
lapply(seq(length(idx)), function(x) data[idx[[x]],] - mean_var1[[x]])

# use foreach (don't forget to register you backend!!!)
library(foreach)
foreach(iter = seq(length(idx))) %dopar% {
    data[idx[[iter]],2] - mean_var1[iter]
}