我在R中编写了一个循环,我想让它运行得更快。任务是计算数据框中的;extension=php_curl.dll
列的增量值(tibble)。皱纹是每个增量应取自time
列具有值的前一行(范围1- 9)大于或等于当前行。我需要运行大约10亿行,当前性能大大低于每秒100万行。所以我正在寻找至少一个数量级的加速。
以下是代码:
level
如何快速运行?
(我在How to add flexible delta columns using dplyr?的dplyr上下文中提出了同样的问题,但我没有设法用dplyr获得我需要的性能,所以我在这里再问一次。)
答案 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)
}
第二个循环需要一秒钟才能运行。