2 つのタイムスタンプ データ A と B があります。
A = c("2015-11-02 08:30:00.054", "2015-11-02 08:30:00.060", "2015-11-02 08:30:00.060", "2015-11-02 08:30:00.062", "2015-11-02 08:30:00.952")
B = c("2015-11-02 08:30:00.016", "2015-11-02 08:30:00.029", "2015-11-02 08:30:00.030", "2015-11-02 08:30:00.045", "2015-11-02 08:30:00.048", "2015-11-02 08:30:00.054", "2015-11-02 08:30:00.056", "2015-11-02 08:30:00.078", "2015-11-02 08:30:00.079", "2015-11-02 08:30:00.079", "2015-11-02 08:30:00.246", "2015-11-02 08:30:00.247", "2015-11-02 08:30:00.251", "2015-11-02 08:30:00.251", "2015-11-02 08:30:00.252")
ベクトル A と B の要素をそれぞれ i と j とします。この場合、$A \in {1,...,5}$ と $B \in {1,...,15}$ です。目的の出力行列 Z は ai x j の行列で、この場合は 5 x 15 です。
i と j の間隔ごとに、時間間隔が重複しているかどうか、Z_{i,j} に 1 が記録されているかどうかを確認したいと思います。したがって、[A_i,A_{i+1}] と [B_j, B_{j+1}] の時間間隔が重なる場合は、1 を記録します。
たとえば、i=1 および j=1 の場合、["2015-11-02 08:30:00.054"、"2015-11-02 08:30:00.060"] および ["2015-11-02 08:30] :00.016", "2015-11-02 08:30:00.029"] は重複しないため、Z_{1,1} の出力は 0 です。
私が今試したのは、i と j ごとに、ベクトル全体を調べて、lubridate パッケージで as.interval と int_overlaps 関数を使用することです。ただし、可能であれば、この問題に対するベクトル化されたソリューションが必要です。私の A および B ベクトルには 10,000 を超える変数が含まれていることが多いため、非常に遅くなります。
私は以下を使用して、ひどく非効率的な jj 行列で ii を乗算した価格を生成しようとしました。
r1 = as.interval( strptime(as.POSIXlt((A), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[ii], strptime(as.POSIXlt((A), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[ii+1])
r1 = as.interval( strptime(as.POSIXlt((B), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[jj], strptime(as.POSIXlt((B), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[jj+1])
int_overlaps(r1,r2)
結論として、私は今のところ以下を持っています。動作しますが、非常に遅いです。
tch = function(time_vector){
strptime(as.POSIXlt(as.character(time_vector), format = "%Y-%m-%d %H:%M:%OS",
tzone = "CT"), format = "%Y-%m-%d %H:%M:%OS")}
Z = matrix(0, length(A)-1, length(B)-1)
for (ii in 1:(length(A)-1)){
for (jj in 1:(length(B)-1)){
r1 = as.interval(tch(A)[ii], tch(A)[ii+1])
r2 = as.interval(tch(B)[jj], tch(B)[jj+1])
# save all overlaps and compute all the vectors
if( int_overlaps(r1,r2) ){
Z[ii,jj] = 1
}
if (jj > 1){
if (Z[ii,jj] == 0 & Z[ii,(jj-1)] == 1){
break
}}
}
print(paste(jj,ii))}
どんな助けでも大歓迎です!