
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