operación rowwise con dplyr
Estoy trabajando en un gran marco de datos en R de 2,3 millones de registros que contienen transacciones de usuarios en ubicaciones con tiempos de inicio y finalización. Mi objetivo es crear un nuevo marco de datos que contenga la cantidad de tiempo conectado por usuario / por ubicación. Llamemos a esto conectado por hora.
La transacción puede variar de 8 minutos a 48 horas, por lo que el marco de datos objetivo será de alrededor de 100 millones de registros y crecerá cada mes.
El código debajo muestra cómo se desarrolla el marco de datos final, aunque el código total es mucho más complejo. La ejecución del código total demora ~ 9 horas en una CPU Intel (R) Xeon (R) E5-2630 v3 @ 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 este procedimiento sobre (algunos de) los 16 núcleos para acelerar el procedimiento. Un primer intento fue usar elmultidplyr
paquete. La partición se realiza en función dedaynr
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()
Ahora elrowwise
La función parece requerir un marco de datos como entrada en lugar de una partición.
¿Hay alguna solución para realizar un cálculo de rowwise en particiones por núcleo?
¿Alguien tiene una sugerencia para realizar este cálculo con un paquete y métodos de R diferentes?