我正試圖逐日計算3月份covid病例的滾動平均數。
例如,3月5日應取3月前5天的病例平均數,20日應取前20天的病例平均數。
我已經為此寫了一小段代碼,但是有沒有一個預構建的函數或者更好的方法呢?
df:
Country.Region Date Cases_count
<chr> <date> <dbl>
1 France 2021-03-01 4730
2 France 2021-03-02 22872
3 France 2021-03-03 26903
4 France 2021-03-04 25286
5 France 2021-03-05 23507
6 France 2021-03-06 23306
7 France 2021-03-07 21835
8 France 2021-03-08 5534
9 France 2021-03-09 23143
10 France 2021-03-10 29674
code:
max_date <- ymd(max(df$Date))
march <- seq(ymd("2021-03-01"), ymd(max_date), by = "day")
rolling_data <- lapply(march, function(x){
rolling_avg <- df %>%
filter(
Country.Region == "France",
Date %in% c(ymd("2021-03-01"): x)) %>%
summarise(rolling_mean = mean(Cases_count)) #%>%
# from: https://stackoverflow.com/questions/61038643/loop-through-irregular-list-of-numbers-to-append-rows-to-summary-table
data.frame(Date = x, rolling_march = rolling_avg)
})
do.call(rbind,rolling_data)
output:
Date rolling_mean
1 2021-03-01 4730.00
2 2021-03-02 13801.00
3 2021-03-03 18168.33
4 2021-03-04 19947.75
5 2021-03-05 20659.60
6 2021-03-06 21100.67
7 2021-03-07 21205.57
8 2021-03-08 19246.62
9 2021-03-09 19679.56
10 2021-03-10 20679.00
問題:為了與案例計數一起使用,我必須進行一些連接。因此,如果有一些預先構建的函數,那么我可以將其與mutate或summary一起使用。
所以你真正想要的是累積平均線,而不是滾動/移動平均線。
一種更簡單的方法是使用
cumsum
。例如,如果有一個包含N個元素的向量x
,則累積平均值可以表示為:對于實際的滾動平均值,
zoo
pkg為我們提供了zoo::rollmean
。