R group_by и подвести итог в последние образцы - PullRequest
0 голосов
/ 19 декабря 2018

Я использую следующий набор данных в качестве примера:

       ID   Time       Value  3pt-min     
1      i1   2018-1-1     1.1   NA     
2      i1   2018-2-1     2.1   NA       
3      i1   2018-3-1     3.1   1.1     
4      i1   2018-4-1     -1    -1      
5      i2   2018-1-1     10    NA       
6      i2   2018-2-1     20    NA     
7      ...

Предположим, я хочу получить: для каждой ID каждой time точки я хочу получить сводную статистику за последние 3 дня дляValue переменная (скажем, запустить min, или они увеличились в течение двух дней подряд)Как я могу сделать это эффективно (без простого цикла)?

Спасибо

1 Ответ

0 голосов
/ 20 декабря 2018

Это должно сделать это.Обратите внимание, что если в одной из групп будет менее трех строк, вы получите сообщение об ошибке.

dd <- tibble::tribble(
  ~ID,   ~Time,       ~Value,     
  'i1',   as.Date('2018-01-01'),     1.1,        
  'i1',   as.Date('2018-02-01'),     2.1,          
  'i1',   as.Date('2018-03-01'),     3.1,       
  'i1',   as.Date('2018-04-01'),     -1,          
  'i2',   as.Date('2018-01-01'),     10,           
  'i2',   as.Date('2018-02-01'),     20,
  'i2',   as.Date('2018-03-01'),     -40  
)

library(dplyr)

dd %>%
  group_by(ID) %>%
  arrange(Time, .by_group = TRUE) %>%
  mutate(`3pt-min` = zoo::rollapply(Value, 3, min, fill = NA, align = "right"))

# A tibble: 7 x 4
# Groups:   ID [2]
  ID    Time       Value `3pt-min`
  <chr> <date>     <dbl>     <dbl>
1 i1    2018-01-01   1.1      NA  
2 i1    2018-02-01   2.1      NA  
3 i1    2018-03-01   3.1       1.1
4 i1    2018-04-01  -1        -1  
5 i2    2018-01-01  10        NA  
6 i2    2018-02-01  20        NA  
7 i2    2018-03-01 -40       -40 
...