[R-br] Problemas com split+lapply
Rubem Kaipper Ceratti
rubem_ceratti em yahoo.com.br
Segunda Outubro 31 10:05:38 BRST 2011
Caros listeiros,
estou com uma base de dados para a qual preciso calcular médias móveis para dois atributos com relação a certos níveis de fatores. Para isso, pensei em utilizar uma combinação de split+lapply, mas mesmo com apenas pouco mais de 126.000 observações o split do banco de dados leva uma eternidade (um dos fatores possui 1242 níveis). Posteriormente tentei utilizar a função ddply (pacote plyr), mas retorna um erro.
Alguma sugestão?
Segue um exemplo abaixo (base com menos observações que a original):
P<-2000:2010
Rep<-letters[1:5]
TF<-1:2
CC<-paste("H-",101:299,sep="")
a<-expand.grid(P=P,R=Rep,TF=TF,CC=CC)
a$y<-rnorm(nrow(a))
a$z<-runif(nrow(a))
library(zoo)
ma.fun<-function(x,k){
mm.y<-rollmean(x$y,k)
mm.z<-rollmean(x$z,k)
cbind(x[-c(1:2),-c(5:6)],ma.y=c(mm.y),ma.z=c(mm.z))
}
# Abordagem 1: Nem chega a completar o split
a.1<-split(a,list(a$R,a$TF,a$CC),drop=T)
a.2<-lapply(a.1,ma.fun,k=3)
# Abodagem 2: Mensagem de erro:
# Erro em do.ply(i) :
# task 1 failed - "adicionando classe "factor" a um objeto inválido"
# Além disso: Mensagens de aviso perdidas:
# 1: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’
#
# 2: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’
library(plyr)
library(doSNOW)
library(foreach)
ncpu<-4
cl<-makeSOCKcluster(rep("localhost",ncpu))
registerDoSNOW(cl)
clusterEvalQ(cl,c(library(plyr),library(zoo)))
a.2<-ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)
Grato,
Rubem
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20111031/25524e60/attachment-0001.html>
Mais detalhes sobre a lista de discussão R-br