加快R

时间:2018-02-14 11:24:27

标签: r performance for-loop if-statement vectorization

我有以下代码:

for (i in 1:nrow(active)){
  for (j in 1:nrow(UniqueTracks)){
    if (((grepl(active$Route1[i], UniqueTracks$Route1[j], perl = TRUE)) & (grepl(active$FlightLevelTrack[i],UniqueTracks$FLs[j], perl = TRUE)) & (active$ThirtyWestTime[i]>=UniqueTracks$Activation[j]) & (active$ThirtyWestTime[i]<=UniqueTracks$Deactivation[j]))){
    active$CalculatedTrack[i]<-UniqueTracks$NATTrack[j]
   }
  }
}

它的目的是找出是否在另一个数据帧变量(grepl)中找到一个数据帧值。它还需要查找一个数据帧中的时间是否在第二个数据帧中的两个其他时间之间。 因此需要双循环。

在一个数据帧(活动)中,有20573行和120列。在第二个数据帧(UniqueTracks)中有477行和7列。

目前,它需要花费数小时才能运行,并正在寻求帮助以加速一切。

我已经读过,矢量化可以帮助加快速度,但之前从未使用过,对它们知之甚少。这有助于加快速度吗?还是有另一种方法可以做到这一点吗?

active
Route1   FlightLevelTrack    ThirtyWestTime
a b c          360          2017-02-01 12:01:34   

UniqueTracks
Route1           FLs               Activation         Deactivation     NATTrack
z a b c d    360 380 390 400      2017-02-01 11:30:00   2017-02-01 16:00:00      F

期望的输出

active
Route1   FlightLevelTrack    ThirtyWestTime         CaluclatedTrack
a b c          360          2017-02-01 12:01:34            F

1 个答案:

答案 0 :(得分:1)

我确实是一个菜鸟,但是,你需要在这里使用一个循环吗?尝试通过Route1合并数据帧。然后删除数据帧之间想要相同的变量中的NA(对我来说看起来像FlightLevelTrack)。这可以通过使用dplyr包中的inner_join()函数一步完成。对我来说似乎很快

 active <- data.frame(Route1 = c('a','b','c'), 
FlightlevelTrack = c(360,360,355))



UniqueTracks <- data.frame(Route1 = c('z','a','b','c','d'), 
FLS = c(360,380,390,400,1),NATTrack = c('F','F','F','F','F'))


output <- dplyr::inner_join(UniqueTracks , active ,by = "Route1")
output 

希望这有帮助。