簡體   English   中英

如果時間差小於id和類型的值,則求和

[英]sum if the time difference is smaller than the value by id and by type

關於此問題: 如果日期差小於某個值,則求和現在,由於有了@Davis Vaughan,我現在可以計算在過去12h中發生的事件數:

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”(類型)分組。 我嘗試了數據表和數據框,但沒有成功:

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

謝謝!!

必須有一種更經典的方法,但是應該這樣做:

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM