使用plyr或矩阵代数从列中减去分组平均值

使用plyr或矩阵代数从列中减去分组平均值,r,linear-algebra,plyr,mean,R,Linear Algebra,Plyr,Mean,我试图编写一些可并行化的代码(explotingplyr和doMC)来计算并从数据帧的列中减去分组平均值。我很难使plyr语法正确 以下是带有working 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(

我试图编写一些可并行化的代码(exploting
plyr
doMC
)来计算并从数据帧的列中减去分组平均值。我很难使
plyr
语法正确

以下是带有working 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'
有人能解决这个问题吗


或者,如果这在矩阵中是可行的,我会非常感谢比我更具矩阵直觉的人提供这种解决方案。

为了充分利用
plyr
,我会将
colwise
和基函数
scale
结合起来。此外,如果需要,让
ddply
在最高级别处理并行化:

dm <- ddply(data, "ID", colwise(scale, center = TRUE, scale = FALSE),
            .parallel = TRUE)

dm为了充分利用
plyr
,我将组合
colwise
和基本函数
scale
。此外,如果需要,让
ddply
在最高级别处理并行化:

dm <- ddply(data, "ID", colwise(scale, center = TRUE, scale = FALSE),
            .parallel = TRUE)
dm