我以以下数据集为例:
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循环)?
谢谢
答案 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