2014-01-29 5 views
1

데이터베이스로부터 시간 간격으로 수집 된 데이터가 있습니다. 메트릭은 계속 증가하는 것처럼 카운터입니다. 주어진 시간에 대한 메트릭 값을 얻으려면 같은 행의 이전 버전에서 한 행을 뺍니다.두 개의 다른 행에서 데이터를 뺍니다.

예 :

    TS INST_ID   EVENT WAIT_TIME_MILLI WAIT_COUNT 
2014-01-29 17:20:36  1 log file sync    1  756873 
2014-01-29 17:20:36  1 log file sync    2  15627 
2014-01-29 17:20:36  1 log file sync    4  2925 
2014-01-29 17:21:03  1 log file sync    1  761063 
2014-01-29 17:21:03  1 log file sync    2  15659 
2014-01-29 17:21:03  1 log file sync    4  2929 

원하는 출력 :

    TS INST_ID   EVENT WAIT_TIME_MILLI WAIT_COUNT 
2014-01-29 17:21:03  1 log file sync    1  4190 
2014-01-29 17:21:03  1 log file sync    2   32 
2014-01-29 17:21:03  1 log file sync    4   4 

TS이 메트릭은 수집 된 시간이다. INST_ID, EVENT 및 WAIT_TIME_MILLI는 정적 식별자입니다. 하나의 TS에서 다음 TS로 WAIT_COUNT의 델타를 계산하려고합니다.

데이터를 약간 단순화했으나 중요한 경우 많은 이벤트가 있고 여러 INST_ID가 될 수 있습니다.

structure(list(TS = structure(c(1391034063.541, 1391034063.541, 
1391034063.541, 1391034036.136, 1391034036.136, 1391034036.136 
), class = c("POSIXct", "POSIXt")), INST_ID = c(1, 1, 1, 1, 1, 
1), EVENT = c("log file sync", "log file sync", "log file sync", 
"log file sync", "log file sync", "log file sync"), WAIT_TIME_MILLI = c(1, 
2, 4, 1, 2, 4), WAIT_COUNT = c(761063, 15659, 2929, 756873, 15627, 
2925)), .Names = c("TS", "INST_ID", "EVENT", "WAIT_TIME_MILLI", 
"WAIT_COUNT"), class = "data.frame", row.names = c(NA, 6L)) 
+0

참조'diff' 차이와'plyr' 설명서를 – mlt

답변

4

: 분할 data.frame 처리를위한

library(dplyr) 
dat %.% 
    arrange(WAIT_TIME_MILLI, TS) %.% 
    group_by(WAIT_TIME_MILLI) %.% 
    mutate(diff = WAIT_COUNT - lag(WAIT_COUNT)) %.% 
    filter(!is.na(diff)) 
+1

이것은 아주 좋습니다. 'data.table' /'dplyr'의 rosetta stone이 만들어졌습니다. – BrodieG

+0

우수 답변 @ Vincent! 나는 dplyr 솔루션을 구현했다. 또한 dplyr 응답을 업데이트하고 EVENT를 arrange 및 group_by에 추가했습니다. 이 누락은 데이터를 너무 단순화하고 하나의 이벤트 만 보여줌으로써 실제로 내 잘못이었습니다. "로그 파일 동기화", "로그 파일 병렬 쓰기", "db 파일 순차적 읽기"등과 같이 캡처중인 다양한 이벤트가 있습니다. –

3

data.table 구현 MLT의 제안 @ : 여기

테스트 데이터 프레임의

library(data.table) 
dt <- data.table(df, key="TS")    # `key` orders dt by TS ascending 
dt[, 
    list(
    TS=tail(TS, -1L),      # all but first 
    WAIT_COUNT=diff(WAIT_COUNT)),   # differences in WAIT_COUNT 
    by=list(INST_ID, EVENT, WAIT_TIME_MILLI) # split by these fields 
] 
# INST_ID   EVENT WAIT_TIME_MILLI     TS WAIT_COUNT 
# 1:  1 log file sync    1 2014-01-29 17:21:03  4190 
# 2:  1 log file sync    2 2014-01-29 17:21:03   32 
# 3:  1 log file sync    4 2014-01-29 17:21:03   4 

는 기본적으로 각 그룹에 대해 다음 INST_ID/이벤트/WAIT_TIME하여 데이터를 파괴하고, diff 모든 값 및 첫 번째 시간 스탬프를 버립니다.

EDIT : 어떻게 든 결국 dput을 알지 못했습니다. ? 데이터가 나타나서

library(dplyr) 
dat <- arrange(dat, WAIT_TIME_MILLI, TS) 
dat <- group_by(dat, WAIT_TIME_MILLI) 
dat <- mutate(dat, diff = WAIT_COUNT - lag(WAIT_COUNT)) 
filter(dat, !is.na(diff)) 

또는 전화 data.frame 경우

+0

감사에 대한 data.table 솔루션도 마찬가지입니다. 나는 아마 더 분명하게해야했다. –

관련 문제