[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