优化R循环

时间:2017-03-03 11:23:16

标签: r

我在R中编写了一个循环,我想让它运行得更快。任务是计算数据框中的;extension=php_curl.dll列的增量值(tibble)。皱纹是每个增量应取自time列具有值的前一行(范围1- 9)大于或等于当前行。我需要运行大约10亿行,当前性能大大低于每秒100万行。所以我正在寻找至少一个数量级的加速。

以下是代码:

level

如何快速运行?

(我在How to add flexible delta columns using dplyr?的dplyr上下文​​中提出了同样的问题,但我没有设法用dplyr获得我需要的性能,所以我在这里再问一次。)

1 个答案:

答案 0 :(得分:0)

我不确定我完全理解您使用所提供的代码所做的事情,但最好的方法是删除显式循环。像这样:

tl$delta <- tl$time - ref[tl$level]
ref[1:tl$level] <- tl$time

然后总结你的增量,或者你需要的任何操作。 R不能很好地运行循环。它喜欢像数据帧这样的大型矩阵。我再给你一个例子。假设我想计算我的数据框中的哪些客户每天都留在我的酒店,考虑到他们的到达和离开。我可以写一个这样的循环:

days<-seq(as.Date("2016-01-01"), as.Date("2016-12-31"), by="days")
num_guests<-rep(0, length(days))
for(d in c(1:length(num_guests))){
   for(i in c(1:nrow(guests.df))){
      if(guests.df$Arrive_Date[i]<=days[d] &  guests.df$Leave_Date[i]>=days[d] ){
  num_guests[d]=num_guests[d]+1
 }
 }
}

此循环策略需要13分钟才能在我的数据框中拥有6700位访客的i7处理器上运行。或者我可以改为:

for(d in c(1:length(num_guests))){
  guests.df$in_period<-guests.df$Arrive_Date<=days[d] & guests.df$Leave_Date>=days[d] 
  num_guests[d]<-sum(guests.df$in_period)
}

第二个循环需要一秒钟才能运行。