2017-12-11 6 views
0

タイムスタンプと別の変数のマージを試みています。具体的には、チェーン内のアンブレットピックアップの数を見ています。これらは、同じ全体的な旅行と見なされるチェーン内の同じアンブレットによる複数のピックアップですが、単独のトリップは単独で行われます。タイムスタンプを使用したRのFoverlapsのY(RIGHT JOIN)の取得

私はこのためにsqldfを使用しましたが、foverlapsははるかに高速でスケーラブルなようですので、私はこのパッケージまたはそれを好きなものを利用したいと思います。私は2つをマージして、プロジェクトの開始時間がチェーン時間内にどれだけあるかを調べることができますが、yでは非マッチでリターンを得られません。

以下は再生するコードです。この場合、IDで指定されたアングレットは1つだけです。私はリファレンスとして、このリンクを使用しています: 以下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)] 

は、私が欲しいの結果を取得するSQLバージョンです:

#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:

最初の応答が答えているようですほとんどすべての質問がありますが、私はエンド・プロダクトが次のようになるように、マージから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 

FURTHER UPDATE:提案されているよう が実装: 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

関連する問題