2016-03-24 4 views
1

私は2つのイベント(xとy)が不規則に発生する時系列を持っています。 私はxから最も近いyイベントまでの時間を記述するスクリプトを少し書こうとしています。例えば時刻の2つの時系列における最も近い時刻の差

Time   x   y 
11:01:00  1   0 
11:03:04  0   1 
11:03:34  0   0 
11:06:12  1   1 
11:12:00  0   0 

Iは、各行がYの各「1」からXベクトルに最も近い「1」までの時間であるベクターを作成しようとしています。

したがって、上記の返します:

diff 
02:04 (closest point is the previous row here) 
0  (occurred on the same row so time difference is 0) 
05:48 (occurred on the previous row) 

再現性の例:

time<-c("11:01:00","11:03:04","11:03:34","11:06:12","11:12:00") 
x<-c(1,0,0,1,0) 
y<-c(0,1,0,1,0) 
df<-data.frame(time,x,y) 

を私はこれについて移動する方法が本当にわからないと任意の助けをいただければ幸いです!我々は時間の欄にarithmaticを使用することができますので、

df$time <- as.POSIXct(df$time, format = "%H:%M:%S") 

はその後、我々はで、二つの新しい列を作成POSIXct形式にデータを変換することによって

まず:

答えて

0

我々は段階のカップルで行うことができますindex of xここで、xは1です。あなたのデータはここでは時間順であると仮定しています。 tidyrを使用することにより

df$nextx <- ifelse(df$x == 1, which(df$x == 1), NA) 
df$prevx <- rev(ifelse(df$x == 1, which(df$x == 1), NA)) 

::埋める、我々は、各yの次および前のXを得るために、XXに記入:

library(tidyr) 
df <- df %>% fill(nextx, rev(prevx)) 

その後、我々は、各行に最小距離を見つけるためにPMINを使用

x[df$y == 1] 
Time differences in secs 
[1] 124 0 
:YSを持つ行によって

x = pmin(abs(df$time - df$time[df$nextx]), abs(df$time - df$time[df$prevx])) 

とサブセット

(おそらく、あなたはあなたのデータは最後の場所にyの1を持っていると思った、私たちはご希望の答えを得ることになる場合には):

Time differences in secs 
[1] 124 0 348 
+0

ありがとう!私はこれを介して作業しようとしています - 私は間違いなくdplyrを持っていますが、3番目のステップに着くと、関数fillが存在しないというエラーコードが表示されます。 " " function_list [[k]](値)のエラー:関数 "fill"を見つけることができませんでした。 " 私は周りにGoogleを持っていましたが、塗りつぶし機能の言及を見つけることができませんでしたか? – Ash

+0

私の悪い、満ちているのはきれいな人です、今すぐ試してください – jeremycg

関連する問題