2017-10-16 7 views
1

에 의해 작은 경우 :합 시간 차이가 ID로 값보다이 문제에 관한 유형

: Sum if the date difference is smaller than a value 가 지금은 @Davis 본입로 이전 12 시간 덕분에 일어난 사건의 수를 계산 할 수있을
df <- tribble(
    ~fechayhora,  ~id,  ~tipo, 
    "2017-03-17 08:03:00", "A", "APF", 
    "2017-05-17 10:34:00", "A", "APF", 
    "2017-05-17 12:52:00", "A", "APF", 
    "2017-05-17 08:52:00", "A", "APP", 
    "2017-05-17 10:52:00", "A", "APP", 
    "2017-05-17 10:46:00", "B", "APP", 
    "2017-05-17 14:23:00", "B", "APP", 
    "2017-05-17 17:29:00", "B", "APF" 
) 

df <- df %>% 
    mutate(fechayhora = as.POSIXct(fechayhora), 
     minus_12 = fechayhora - hours(12)) 

df <- df %>% mutate(
    number_of_APF_12h = map2_dbl(.x = fechayhora, 
           .y = minus_12, 
           .f = ~sum(between(df$fechayhora, .y, .x)) - 
1)) 

그런 다음 "id"및 "tipo"(유형)별로 그룹화하려고합니다. 나는 아무가 성공과 함께, 데이터 테이블 및 데이터 프레임 tryed했습니다

df=df[,number_of_failures_12h = map2_dbl(.x = fechayhora, 
           .y = minus_12, 
           .f = ~sum(between(df$fechayhora, .y, .x)) - 
1)),by=.(tipo,id)] 

또는

df <- df %>% 
group_by(id,tipo) 
%>% mutate(
    number_of_failure = map2_dbl(.x = fechayhora, 
           .y = minus_12, 
           .f = ~sum(between(df$fechayhora, .y, .x)) - 
1)) %>% 
ungroup() 

결과 예상 :

fechayhora    id tipo  n_APP n_APF 
    "2017-03-17 08:03:00", "A", "APF", 0  0 
    "2017-05-17 10:34:00", "A", "APF", 0  1 
    "2017-05-17 12:52:00", "A", "APF", 0  2 
    "2017-05-17 08:52:00", "A", "APP", 0  2 
    "2017-05-17 10:52:00", "A", "APP", 1  2 
    "2017-05-17 10:46:00", "B", "APP", 0  0 
    "2017-05-17 14:23:00", "B", "APP", 1  0 
    "2017-05-17 17:29:00", "B", "APF"  0  0 

감사합니다!

+0

죄송합니다, 추측 – akrun

+0

의 많은 당신이 원하는 경우에,없는 것을 말해있다 분명 당신에게 감사합니다 – Martu

+0

어떻게 할 수 없으므로 dplyr로 예상 출력을 얻었습니까 – akrun

답변

0

는 classier 방법이 있어야합니다,하지만 그것을 수행해야합니다

# Auxiliary function 
count_failures <- function(group, last_12, rowid, type) { 
    group[1:rowid-1, ] %>% 
    filter(tipo %in% type & fechayhora >= last_12) %>% 
    nrow() 
} 

split_by_group <- df %>% 
    group_by(id) %>% 
    do(data = (.)) %>% 
    select(data) %>% 
    map(identity) %>% 
    .[[1]] 

df_s <- split_by_group %>% 
    map(arrange, fechayhora) %>% 
    map(.f = function(x) { 
    x %>% 
     rowid_to_column() %>% 
     rowwise() %>% 
     mutate(n_APP = count_failures(x, minus_12, rowid, "APP"), 
      n_APF = count_failures(x, minus_12, rowid, "APF")) %>% 
     ungroup() %>% 
     select(-rowid) 
     }) %>% 
    bind_rows() 

출력 :

# A tibble: 8 x 6 
      fechayhora id tipo   minus_12 n_APP n_APF 
       <dttm> <chr> <chr>    <dttm> <int> <int> 
1 2017-03-17 08:03:00  A APF 2017-03-16 20:03:00  0  0 
2 2017-05-17 08:52:00  A APP 2017-05-16 20:52:00  0  0 
3 2017-05-17 10:34:00  A APF 2017-05-16 22:34:00  1  0 
4 2017-05-17 10:52:00  A APP 2017-05-16 22:52:00  1  1 
5 2017-05-17 12:52:00  A APF 2017-05-17 00:52:00  2  1 
6 2017-05-17 10:46:00  B APP 2017-05-16 22:46:00  0  0 
7 2017-05-17 14:23:00  B APP 2017-05-17 02:23:00  1  0 
8 2017-05-17 17:29:00  B APF 2017-05-17 05:29:00  2  0 
+0

Hello @quartin! 답변을 주셔서 대단히 감사 합니다만, 그 결과는 두 개의 열이 있습니다 : n_failures 유형 APP 수와 n 실패 수 유형 APF; 그것은 각 라인에 대한 것입니다 내가 얼마나 preivous 유형의 이벤트가 발생했는지 알고 싶습니다 ... – Martu

+0

나는 대답을 편집했습니다, 당신은 출력이 원하는지 확인하시기 바랍니다 수 있습니까? 예상 출력과 원하는 것에 대한 설명이 일치하지 않는 것 같습니다 ... – quartin

+0

@Martu 나는'group_by'에서 오타가있었습니다. 대답을 편집 할 때 제대로 복사되지 않았습니다. 이제 해결되었습니다. – quartin