是否可以使用 lapply 替代方案来提高循环性能或提高完成速度

Is it possible to improve loop performance or improve completion speed with lapply alternatives

我有一个嵌套的 for 循环,它 运行 遍历 800,000+ 观察 data.frame 中的每一行,称为 alltrx。它检查 alltrx 中的 Posixct 格式化列 TIME 中的每个值是否在根据称为 long 的第二 data.frame 中的值创建的日期间隔内。如果条件为真,则循环从 "correct" 行中获取行号,其日期间隔是从 long 获得的,并将其放入新列 alltrx$Survey 中。据我所知,它正在运行,但我尝试使用进度条,但一小时内只完成了 4%。我想问一下是否有人对如何加快速度有想法?我也有 alltrx 作为列表列表,其中数据在列表之间划分(以对我的项目有意义的方式)。

我看过 and this 但它似乎没有提供太多提高速度的机会,第二个根本没有太大帮助...

...请参阅下面的代码


for (i in 1:nrow(alltrx)){ 
  for (j in 1:nrow(long)) {
    if(alltrx$TIME2[i] %within% 
       (interval(ymd(long$V2[j]), ymd(long$V1[j])))){alltrx$Survey[i]<-row.name(long[j])}
  }
}

我有兴趣改进我的循环代码或其他可能具有更好性能的编码替代方案,例如 lapply 感谢您提供的所有帮助。我没有提供数据集,因为它似乎没有必要,但如果有人指出拥有它的重要性,我可以这样做。

最后,通过将大型数据帧处理为一系列列表(我认为)允许多个进程同时发生,这个过程明显加快了(5 分钟与大约 24 小时相比)。在涉及日期间隔的地方,fuzzyjoin::left_fuzzy_join() 有助于概述 match_fun 参数允许您确定与 by 参数中选择的每 2 个变量的条件关系的条件。希望有人发现这个有趣甚至有用 :p

要完成下面的示例,请使用我的脚本中的 运行 命令。注意:原始 alltrx 文件被分成 data.frame 列表,名为 alltrx.list


 fuzz.join <- lapply(alltrx.list, function(x){
      fuzzy_left_join(x, long, by = c("TIME" = "V1", "TIME" = "V2")
    , match_fun = list(`>=`, `<=`))
    })