операция с dplyr
Я работаю над большим фреймом данных в R 2,3 миллиона записей, которые содержат транзакции пользователей в местах с начальным и конечным временем. Моя цель - создать новый фрейм данных, который будет содержать количество времени, подключенного на пользователя / на местоположение. Давайте назовем это почасовой связью.
Транзакция может варьироваться от 8 минут до 48 часов, поэтому целевая датафрейм будет составлять около 100 миллионов записей и будет расти с каждым месяцем.
Код внизу показывает, как разрабатывается окончательный фрейм данных, хотя общий код намного сложнее. Выполнение всего кода занимает ~ 9 часов на процессоре Intel® Xeon® R E5-2630 v3 @ 2,40 ГГц, 16 ядер 128 ГБ ОЗУ.
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")
)
)
Мы хотим распараллелить эту процедуру над (некоторыми из) 16 ядрами, чтобы ускорить процедуру. Первой попыткой было использоватьmultidplyr
пакет. Раздел сделан на основеdaynr
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()
Теперьrowwise
Похоже, что функция требует ввода данных в качестве ввода вместо раздела.
Есть ли обходной путь для выполнения вычисления по строкам для разделов на ядро?
Кто-нибудь получил предложение выполнить этот расчет с другим пакетом и методами R?