2014-07-16 4 views
0

타임 스탬프와 해당 "이벤트"유형 (두 가지 이벤트 유형)이 포함 된 DF와 타임 스탬프 및 이벤트 유형이 승인 인 DF가 있습니다.일치하는 타임 스탬프와 계산 시간 차이 (R)

나는 이벤트와 그것이 인정되는 시간 사이의 시간을 가려려고 노력하고있다.

수신 확인은 즉시 수신되거나 수신 될 수 있습니다 (Tack>=Tevent). 해당하는 응답이없는 경우에, 나는 보여주기 위해 시간 차이를 싶습니다 NA

예 :

dfEvent 
Time  Event 
00:00:01  A 
00:01:00  B 
00:05:00  A 
00:09:00  B 

dfAcknowledgement 
Time  Event 
00:00:02  A 
00:05:10  A 
00:09:05  B 

RESULT 
Time  Event Delay 
00:00:01  A 00:00:01 
00:01:00  B NA 
00:05:00  A 00:00:10 
00:09:00  B 00:00:05 
  • 내가 data.table보고 된 적이 있지만 난 그냥 테이블을 병합하지 않으 : 두 "가까운"행의 값 사이의 차이를 계산하고 싶습니다
  • 나는 which()을 사용하여 확인 응답에 해당하는 이벤트의 인덱스를 찾으려고했지만 인덱스를 얻은 후에는 어떻게 빼기를합니까? 그것은 for 루프없이 해당 행에서?
+0

하지만있을 수없는 상황? 이것은 매우 명확한 매칭 알고리즘이 아닙니다. 최대의 차이는 있습니까? – MrFlick

+0

죄송 합니다만, 나는 언급하지 않았습니다. A-B-A-B-A와 같은 두 가지 유사한 이벤트가 연속적으로있을 수 없습니다. A-A-A-B는 절대로 존재하지 않습니다. 그리고 acknolwedgement가 다음 사건 이전에 접수되지 않으면, 그것은 버리고 결코 받아 들여지지 않을 것입니다. – Ant

+0

그리고 연속적으로 A와 B 이벤트를 삭제하지 않습니까? 이 두 가지 중 하나는 항상 인정 될 것입니까? – MrFlick

답변

0

는 입력 dfEventdfAcknowledgement 정의하고 해당 키도 NextTime 컴퓨팅과 data.table로 변환. 그런 다음 데이터 테이블의 롤 결합을 Time까지 수행하고 Time, Event 및 계산량을 Delay로 유지하십시오.

library(data.table) 
library(chron) 

# test data from question 
dfEvent <- data.frame(Time = c("00:00:01", "00:01:00", "00:05:00", "00:09:00"), 
Event = c("A", "B"), stringsAsFactors = FALSE) 
dfAcknowledgement <- data.frame(Time = c("00:00:02", "00:05:10", "00:09:05"), 
Event = c("A", "A", "B"), stringsAsFactors = FALSE) 

# convert to data.table (also compute NextTime column) 
dtEvent <- with(dfEvent, data.table(Event = Event, Time = times(Time), 
          NextTime = times(c(tail(Time, -1), NA)), 
          key = "Event,Time")) 
dtAcknowledgement <- with(dfAcknowledgement, data.table(Event = Event, 
          Time = times(Time), TimeAck = times(Time), 
          key = "Event,Time")) 


# real work done here - perform rolling join, re-sort & compute desired columns 
roll <- dtAcknowledgement[dtEvent,,roll=-Inf] 
setkey(setkey(roll, NULL), Time, Event) 
roll[, list(Time, Event, Delay = replace(TimeAck, TimeAck>=NextTime, NA)-Time)] 

이 제공 : 두 이벤트를 가지고 있지만 두 번째에 대한 확인이 처음 전에 도착

 Time Event Delay 
1: 00:00:01  A 00:00:01 
2: 00:01:00  B  <NA> 
3: 00:05:00  A 00:00:10 
4: 00:09:00  B 00:00:05 
+0

Brilliant! 내가 알지 못했던 위대한 data.table 패키지의 또 다른 사용법. 고맙습니다. – Ant

관련 문제