operação rowwise com dplyr
Estou trabalhando em um grande dataframe em R de 2,3 milhões de registros que contêm transações de usuários em locais com horários de início e de parada. Meu objetivo é criar um novo quadro de dados que contenha a quantidade de tempo conectada por usuário / por local. Vamos chamar isso de hora em hora conectado.
A transação pode variar de 8 minutos a 48 horas, portanto, o dataframe da meta será de cerca de 100 milhões de registros e aumentará a cada mês.
O código abaixo mostra como o quadro de dados final é desenvolvido, embora o código total seja muito mais complexo. A execução do código total leva ~ 9 horas em uma CPU Intel (R) Xeon (E5) E5-2630 v3 a 2.40GHz, 16 núcleos de 128 GB de RAM.
library(dplyr)
numsessions<-1000000
startdate <-as.POSIXlt(runif(numsessions,1,365*60*60)*24,origin="2015-1-1")
df.Sessions<-data.frame(userID = round(runif(numsessions,1,500)),
postalcode = round(runif(numsessions,1,100)),
daynr = format(startdate,"%w"),
start =startdate ,
end= startdate + runif(1,1,60*60*10)
)
dfhourly.connected <-df.Sessions %>% rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
)
Queremos paralelizar esse procedimento sobre (alguns dos) 16 núcleos para acelerar o procedimento. Uma primeira tentativa foi usar omultidplyr
pacote. A partição é feita com base emdaynr
df.hourlyconnected<-df.Sessions %>%
partition(daynr,cluster=init_cluster(6)) %>%
rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
) %>% collect()
Agora orowwise
A função parece exigir um quadro de dados como entrada em vez de uma partição.
Existe uma solução alternativa para executar um cálculo em linhas nas partições por núcleo?
Alguém tem uma sugestão para realizar esse cálculo com um pacote e métodos R diferentes?