我有两个数据框,我正在使用findInterval。井眼数据是产生油的井眼的x,y和z的数据(VSS =垂直海底深度,md =测量深度,也就是钻头沿井下的实际距离)。 Perfs数据是已经穿过井眼以允许流动的数据(top_perf = md,bot_perf = md)。R矢量化findInterval大型数据集
Perfs:
Well_ID top_perf bot_perf well_name surface ID x y VSS
056-W 2808 2958 056-W Ranger 2 0 0 0
056-W 3150 3250 056-W Ranger 1 0 0 0
056-W 3150 3250 056-W Ranger 2 0 0 0
056-W 3559 3664 056-W UT 1 1 0 0 0
056-W 3559 3664 056-W UT 2 2 0 0 0
057-W 2471 2952 057-W Tar 1 0 0 0
057-W 2471 2952 057-W Tar 2 0 0 0
058-W 2615 2896 058-W Ranger 1 0 0 0
058-W 2615 2896 058-W Ranger 2 0 0 0
井筒:
well_name well_id md vss x y
056-W 056-W 3260 -3251.46 4221436 4030454
056-W 056-W 3280 -3271.45 4221436 4030454
056-W 056-W 3300 -3291.45 4221435 4030453
056-W 056-W 3320 -3311.44 4221435 4030453
056-W 056-W 3340 -3331.44 4221434 4030453
056-W 056-W 3360 -3351.43 4221434 4030453
056-W 056-W 3380 -3371.43 4221433 4030453
056-W 056-W 3400 -3391.42 4221433 4030453
的目标是找到Perfs $ top_perf和Perfs $ bot_perf是价值最接近于井筒$ MD其中Perfs $ Well_ID =井筒$ well_id,然后从Wellbore中提取vss,x和y并将其添加到Perfs。 (我不介意插入它们之间,只需要一些接近的东西)。
这里是我的代码来做到这一点:
for(i in 1:dim(Perfs)[1]){
if(Perfs$ID[i] == 1){
Wellbore_temp <- Wellbore[which(Wellbore$well_id == Perfs[i,"Well_ID"]),]
interval <- findInterval(Perfs[i,"top_perf"], Wellbore_temp$md)
Perfs[i,c("x","y","VSS")] <- Wellbore_temp[interval, c("x","y","vss")]
}else{
Wellbore_temp <- Wellbore[which(Wellbore$well_id == Perfs[i,"Well_ID"]),]
interval <- findInterval(Perfs[i,"bot_perf"], Wellbore_temp$md)
Perfs[i,c("x","y","VSS")] <- Wellbore_temp[interval, c("x","y","vss")]
}
}
此代码的工作,它只是迄今为止,这将在所使用的应用程序,我怎样才能摆脱循环的和做太慢。更加矢量化的方式来加快速度?也打开findInterval之外的建议。
如果只是在显示的示例数据上运行,则某些“最近的”匹配相当糟糕,但除非您计算距离,否则您不会看到。 – ds440
我应该在原始文章中提到这一点,但是Wellbore表格的MD范围从0到井底,每个井以20为增量。好点子。 –