我正在尝试编写一些可并行化的代码(exploting plyr
和doMC
)来计算并从数据框的列中减去groupwise。我很难让plyr
语法正确。
以下是带有for循环的脚本:
data = data.frame(x = rnorm(100),y = rnorm(100),ID = round(runif(100)*10))
data = data[with(data,order(ID)),]
dm = matrix(rep(NA,nrow(data)*(ncol(data)-1)),nrow(data),(ncol(data)-1))
for (i in 1:(ncol(data)-1)){
m = summaryBy(data[,i]~ID,data=data,fun=mean)
d = data.frame(data[,i],ID=data$ID)
a = merge(d,m,by="ID")
dm[,i] = a[,2]-a[,3]
}
但是我尝试使用ddply通过数据的列名来打破它,它给了我一个错误消息。这是我的非工作代码:
dmf = function(i){
m = summaryBy(data[,i]~ID,data=data,fun=mean)
d = data.frame(data[,i],ID=data$ID)
a = merge(d,m,by="ID")
dm = a[,2]-a[,3]
as.data.frame(dm)
}
dm = ddply(.data=data,.fun = dmf,.variables = colnames(data))
>Error in .subset(x, j) : invalid subscript type 'list'
有人有解决方案吗?
或者,如果这对于矩阵是可行的,我会非常感谢那些具有比我更好的矩阵直觉的人的解决方案。
答案 0 :(得分:4)
为了充分利用plyr
,我会将colwise
和基本函数scale
结合起来。此外,如果需要,让ddply
处理最高级别的并行化:
dm <- ddply(data, "ID", colwise(scale, center = TRUE, scale = FALSE),
.parallel = TRUE)