2017-12-11 2 views
0

타임 스탬프와 다른 변수에 병합을 시도하는 중입니다. 구체적으로 얼마나 많은 앰뷸렛 픽업이 체인에 속해 있는지, 아이디어는 이것들은 동일한 전체적인 여행으로 간주되는 사슬에서 같은 ambulette에 의한 다중 픽업이며, 유일한 여행은 홀로 서 있습니다.타임 스탬프를 사용하여 R에서 Foverlaps에 대한 Y (RIGHT JOIN) 검색

sqldf를이 용도로 사용했지만 foverlaps가 훨씬 빠르고 확장 성이 뛰어나서이 패키지를 사용하고 싶습니다. 두 시간을 합쳐서 얼마나 많은 프로젝트 시작 시간이 체인 시간 내에 속하는 지 알 수는 있지만 y의 일치하지 않는 항목에 대한 수익을 얻지는 못합니다.

아래 코드는 재현 할 코드입니다 (이 경우 ID가 하나만있는 ambulette 만 있음).

#sqldf version 
library(sqldf) 
z = setDT(sqldf("SELECT 
       trips.ambulette_id, 
       trips.pickup, 
       trips.dropoff, 
       chains.ambulette_chain_start, 
       chains.ambulette_chain_end 
       FROM trips LEFT JOIN chains 
       ON trips.ambulette_id = chains.ambulette_id AND 
       pickup BETWEEN ambulette_chain_start AND ambulette_chain_end"))[ 
       ,chained:=ifelse(is.na(ambulette_chain_start), "no", "yes")] 

z 

UPDATE :

첫 번째 응답이 응답 할 것 나에게 내가 원하는 결과를 얻는 SQL 버전을 아래 Data Table merge based on date ranges

#example--- 
trips = data.table(
    "ambulette_id" = "1" 
    ,"pickup" = as.POSIXct(c("2017-08-01 04:30:54", 
         "2017-08-01 04:50:54", "2017-08-01 05:25:54", "2017-08-01 05:35:54", 
         "2017-08-01 07:45:54", "2017-08-01 08:15:54", "2017-08-01 09:15:54", 
         "2017-08-01 09:15:54", "2017-08-01 10:00:54", "2017-08-01 11:40:54", 
         "2017-08-01 12:00:54", "2017-08-01 12:40:54"), tz = "GMT") 
    ,"dropoff" = as.POSIXct(c("2017-08-01 05:00:59", 
         "2017-08-01 05:00:59", "2017-08-01 05:55:59", "2017-08-01 05:55:59", 
         "2017-08-01 08:35:59", "2017-08-01 08:35:59", "2017-08-01 09:30:59", 
         "2017-08-01 09:45:59", "2017-08-01 10:30:59", "2017-08-01 11:50:59", 
         "2017-08-01 12:15:59", "2017-08-01 13:05:59"), tz = "GMT") 
)[,pickup2:=pickup] 


chains = data.table(
    "ambulette_id" = "1" 
    ,"ambulette_chain_start" = as.POSIXct(c("2017-08-01 04:30:54", 
          "2017-08-01 05:25:54", "2017-08-01 07:45:54", "2017-08-01 09:15:54" 
), tz = "GMT") 
    ,"ambulette_chain_end" = as.POSIXct(c("2017-08-01 05:00:59", "2017-08-01 05:55:59", 
          "2017-08-01 08:35:59", "2017-08-01 09:45:59"),tz = "GMT") 
) 



#The final result is to merge trips on chains to get the pickups in trips that start in between the ranges in chains. Any pickups that don't match, should still show up as lone pickups, but instead foverlaps dumps them. Is there anyway to keep them? 


setkey(trips,ambulette_id,pickup, pickup2) 
final_join = foverlaps(chains 
         ,trips 
         ,by.x = c("ambulette_id", "ambulette_chain_start", "ambulette_chain_end"))[ 
         ,pickup2:=NULL] 

#test shows some trips not showing up in the final join 
trips[!(pickup %in% final_join$pickup)] 

있다 : 나는 참고로이 링크를 사용하고 있습니다 거의 모든 질문이 있지만, 최종 제품이 다음과 같이 보이도록 병합에서 ambulette 체인 시작 및 끝 열을 유지하고 싶습니다. 내가 어떻게 그럴 수 있니?

ambulette_id    pickup    dropoff ambulette_chain_start ambulette_chain_end chained 
1:   1 2017-08-01 00:30:54 2017-08-01 01:00:59 2017-08-01 00:30:54 2017-08-01 01:00:59  yes 
2:   1 2017-08-01 00:50:54 2017-08-01 01:00:59 2017-08-01 00:30:54 2017-08-01 01:00:59  yes 
3:   1 2017-08-01 01:25:54 2017-08-01 01:55:59 2017-08-01 01:25:54 2017-08-01 01:55:59  yes 
4:   1 2017-08-01 01:35:54 2017-08-01 01:55:59 2017-08-01 01:25:54 2017-08-01 01:55:59  yes 
5:   1 2017-08-01 03:45:54 2017-08-01 04:35:59 2017-08-01 03:45:54 2017-08-01 04:35:59  yes 
6:   1 2017-08-01 04:15:54 2017-08-01 04:35:59 2017-08-01 03:45:54 2017-08-01 04:35:59  yes 
7:   1 2017-08-01 05:15:54 2017-08-01 05:30:59 2017-08-01 05:15:54 2017-08-01 05:45:59  yes 
8:   1 2017-08-01 05:15:54 2017-08-01 05:45:59 2017-08-01 05:15:54 2017-08-01 05:45:59  yes 
9:   1 2017-08-01 06:00:54 2017-08-01 06:30:59     <NA>    <NA>  no 
10:   1 2017-08-01 07:40:54 2017-08-01 07:50:59     <NA>    <NA>  no 
11:   1 2017-08-01 08:00:54 2017-08-01 08:15:59     <NA>    <NA>  no 
12:   1 2017-08-01 08:40:54 2017-08-01 09:05:59     <NA>    <NA>  no 

후 업데이트 : 제안 구현 : 1. 2. 체인 할당을

trips[ 
    chains, on = .(ambulette_id, pickup > ambulette_chain_start, 
       pickup < ambulette_chain_end) 
    ,':='(chained = 'yes' 
     , ambulette_chain_start = ambulette_chain_start 
     ,ambulette_chain_end = ambulette_chain_end)] 

ambulette_id    pickup    dropoff    pickup2 chained ambulette_chain_start 
1:   1 2017-08-01 04:30:54 2017-08-01 05:00:59 2017-08-01 04:30:54  NA     <NA> 
2:   1 2017-08-01 04:50:54 2017-08-01 05:00:59 2017-08-01 04:50:54  yes 2017-08-01 04:30:54 
3:   1 2017-08-01 05:25:54 2017-08-01 05:55:59 2017-08-01 05:25:54  NA     <NA> 
4:   1 2017-08-01 05:35:54 2017-08-01 05:55:59 2017-08-01 05:35:54  yes 2017-08-01 05:25:54 
5:   1 2017-08-01 07:45:54 2017-08-01 08:35:59 2017-08-01 07:45:54  NA     <NA> 
6:   1 2017-08-01 08:15:54 2017-08-01 08:35:59 2017-08-01 08:15:54  yes 2017-08-01 07:45:54 
7:   1 2017-08-01 09:15:54 2017-08-01 09:30:59 2017-08-01 09:15:54  NA     <NA> 
8:   1 2017-08-01 09:15:54 2017-08-01 09:45:59 2017-08-01 09:15:54  NA     <NA> 
9:   1 2017-08-01 10:00:54 2017-08-01 10:30:59 2017-08-01 10:00:54  NA     <NA> 
10:   1 2017-08-01 11:40:54 2017-08-01 11:50:59 2017-08-01 11:40:54  NA     <NA> 
11:   1 2017-08-01 12:00:54 2017-08-01 12:15:59 2017-08-01 12:00:54  NA     <NA> 
12:   1 2017-08-01 12:40:54 2017-08-01 13:05:59 2017-08-01 12:40:54  NA     <NA> 
    ambulette_chain_end 
1:    <NA> 
2: 2017-08-01 05:00:59 
3:    <NA> 
4: 2017-08-01 05:55:59 
5:    <NA> 
6: 2017-08-01 08:35:59 
7:    <NA> 
8:    <NA> 
9:    <NA> 
10:    <NA> 
11:    <NA> 
12:    <NA> 

를 추가 할당 없음 나는 결과가 다를 때문에 내가 생각을 잘못 구현하지있어 생략 나는 SQL 또는 이전 해결책을 얻고있다

답변

2

여기 당신은 간다 :

trips[, chained := 'no'][ 
     chains, on = .(ambulette_id, pickup >= ambulette_chain_start, 
            pickup <= ambulette_chain_end) 
     , `:=`(chained = 'yes', 
      ambulette_chain_start = i.ambulette_chain_start, 
      ambulette_chain_end = i.ambulette_chain_end)][] 
+0

또한 "ambulette_chain_start"및 "ambulette_chain_end"변수를 유지하기 위해 코드를 조정하는 방법은 무엇입니까? – LoF10

+0

당신은 여행을 추가한다는 의미입니까? 체인에 연결된 것과 같은 방식으로 추가하십시오. – eddi

+0

질문에 편집을 추가 했으므로 무슨 뜻인지 알 수 있습니다. 나는 당신이 언급 한 것처럼 추가하려고했지만 작동시키지 못합니다. – LoF10

관련 문제