R group_by并在最近的样本中进行总结

时间:2018-12-19 03:36:04

标签: r dplyr tidyverse

我以以下数据集为例:

       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,我想获取Value变量的最近3天摘要统计信息(例如,运行min ,或者它们是否已连续两天增加)。如何有效地做到这一点(没有普通的for循环)?

谢谢

1 个答案:

答案 0 :(得分:1)

这应该做到。请注意,如果任何组的行数少于三行,您将得到一个错误。

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