小编JR *_*mus的帖子

使用dplyr进行逐行操作

我正在研究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包和方法执行这个计算?

parallel-processing performance r dplyr

15
推荐指数
1
解决办法
1686
查看次数

标签 统计

dplyr ×1

parallel-processing ×1

performance ×1

r ×1