2013-08-08 1 views
1

데이터 프레임의 열에서 그룹 단위 평균을 계산하고 뺄 수있는 병렬화 가능 코드 (plyrdoMC)를 작성하려고합니다. plyr 구문을 올바르게 수정하는 데 어려움을 겪고 있습니다. 여기 plyr 또는 행렬 대수를 사용하여 열에서 그룹 단위 평균 빼기

을위한 루프 작업과 스크립트입니다

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' 

아무도 해결책이 없습니까?

다른 방법으로, 행렬로 행할 수 있다면, 나보다 더 나은 행렬 직감을 가진 누군가로부터의 그런 종류의 솔루션에 크게 감사 할 것입니다.

답변

4

plyr을 최대한 활용하려면 colwise과 기본 기능 scale을 결합합니다. 또한 필요한 경우 ddply이 최상위 수준에서 병렬 처리를 처리하도록하십시오.

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