2017-08-18 3 views
0

すべてが機能していますが、2つのforループで非常に遅い反復です。1つの列と最も近い時刻に基づいて結合します。

基本的に2つのデータフレーム、1つとIDとイベント時間。もう1つは、10秒ごとにさまざまなIDと読み取り値(値とタイムスタンプ)を持つものです。

私はIDとイベント時刻の前に特定の間隔で時刻を合わせることによって、別のテーブルに参加しようとしています。

また、データはoracle SQLサーバーにあります。これは、テーブル結合をSQLでも実行できるかどうかです。

readingdf <- data.frame(sensorID = c('100001','100001','100001','100001','100002','100002','100002','100002'), 
        readTime = as.POSIXct(c("2017-07-24 04:08:09 EDT","2017-07-24 04:08:19 EDT", 
        "2017-07-24 04:08:29 EDT","2017-07-24 04:08:39 EDT","2017-07-24 04:08:09 EDT","2017-07-24 04:08:19 EDT", 
        "2017-07-24 04:08:29 EDT","2017-07-24 04:08:39 EDT"),tz="EST"), 
        Value = c('17.5','15.6','12.9','12.1','22.2', '24.5','19.7','20.1')) 


df <- data.frame(sensorID = c('100001','100002','100001','100002','100001','100002','100001','100001'), 
        eventTime = as.POSIXct(c("2017-07-24 04:08:23 EDT","2017-07-24 04:08:25 EDT","2017-07-24 07:04:40 EDT", 
        "2017-07-24 02:19:30 EDT","2017-07-24 04:37:08 EDT","2017-07-24 04:19:59 EDT","2017-07-24 03:26:49 EDT", 
        "2017-07-24 03:58:17 EDT"),tz="EST")) 
+0

どのような間隔20秒ですか?詳しく教えてください。可能であれば、ここに予想される出力を貼り付けることができますか?ありがとうございました – Onyambu

+0

テーブルが大きい場合は、Oracleサーバーで結合を実行する必要があります。 'select * from t1 inner join t2 on(t1.sensorID = t2.sensorIDとreadTime <= eventTimeとf(eventTime、readTime) <= 20) '、' f'は2つのdatetimesの間の差を秒単位で与える関数です(定義する必要があります)。 – Scarabee

答えて

0

我々はreadTimeの次の20秒を示す、新しい列、readTime_expandを作成することができます。その後、に基づく参加をeventTime = readTime_expandで実行します。 df2が最終出力です。

library(tidyverse) 

readingdf2 <- readingdf %>% 
    mutate(readTime_end = readTime + 20) %>% 
    mutate(readTime_expand = map2(readTime, readTime_end, function(x, y){ 
    return(seq(x, y, by = 1)) 
    })) %>% 
    unnest() 

df2 <- df %>% 
    left_join(readingdf2, by = c("sensorID", "eventTime" = "readTime_expand")) 

df2 
    sensorID   eventTime   readTime Value  readTime_end 
1 100001 2017-07-24 04:08:23 2017-07-24 04:08:09 17.5 2017-07-24 04:08:29 
2 100001 2017-07-24 04:08:23 2017-07-24 04:08:19 15.6 2017-07-24 04:08:39 
3 100002 2017-07-24 04:08:25 2017-07-24 04:08:09 22.2 2017-07-24 04:08:29 
4 100002 2017-07-24 04:08:25 2017-07-24 04:08:19 24.5 2017-07-24 04:08:39 
5 100001 2017-07-24 07:04:40    <NA> <NA>    <NA> 
6 100002 2017-07-24 02:19:30    <NA> <NA>    <NA> 
7 100001 2017-07-24 04:37:08    <NA> <NA>    <NA> 
8 100002 2017-07-24 04:19:59    <NA> <NA>    <NA> 
9 100001 2017-07-24 03:26:49    <NA> <NA>    <NA> 
10 100001 2017-07-24 03:58:17    <NA> <NA>    <NA> 
関連する問題