我有以下代码:
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
答案 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
希望这有帮助。