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