在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]
}
我想贬低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]
}