我正在研究2,3万条记录的R中的大型数据框,其中包含具有开始和停止时间的位置的用户交易.我的目标是创建一个新的数据框,其中包含每个用户/每个位置连接的时间量.我们称这是每小时连接一次.
交易可以从8分钟到48小时不等,因此目标数据框将是大约1亿条记录,并且每个月都会增长.
下面的代码显示了最终数据框的开发方式,尽管总代码更复杂.在英特尔(R)Xeon(R)CPU E5-2630 v3 @ 2.40GHz,16核128GB RAM上运行总代码大约需要9个小时.
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")
)
)
Run Code Online (Sandbox Code Playgroud)
我们希望在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()
Run Code Online (Sandbox Code Playgroud)
现在,该rowwise函数似乎需要一个数据帧作为输入而不是分区.
是否有解决方法来对每个核心的分区执行逐行计算?
有没有人有建议用不同的R包和方法执行这个计算?