findInterval을 사용하는 두 개의 데이터 프레임이 있습니다. 웰 보어 (Wellbore) 데이터는 오일을 생산하는 유정의 x, y, z 데이터입니다 (VSS = 수직 해저 깊이, md = 깊이 a.k.a 드릴 비트가 우물을 따라 이동 한 실제 거리). 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
유정 :
목표는 MD Perfs $ Well_ID = 유정 $ $를 유정 값에 가장입니다 Perfs $의 top_perf 및 Perfs $의 bot_perf을 찾을 수 있습니다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
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 씩 증가했다. 좋은 지적. –