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

时间:2015-05-05 09:35:00

标签: r functional-programming statistics

我想贬低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的每个观察中减去其组的平均值?

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是使用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]
}