使用 R 中的分组数据计算(类似于)移动平均值?

Calculating (something similar to) moving averages with grouped data in R?

假设我想计算 nycflights13 航班的 dep_delay 和 arr_delay 过去 7 天的比率。我尝试了以下方法,但是一旦我将 zoo 中的任何函数放入管道中,它似乎就完全取消了数据分组。

library(tidyverse)
library(nycflights13)
library(zoo)

delay_rate <- flights %>% 
 group_by(year, month, day) %>%
 summarize(delay_rate = 
  (rollsumr(flights$dep_delay, k = 7, fill = NA)) / 
  (rollsumr(flights$arr_delay, k = 7, fill = NA)
)

有几个问题:

  1. 通过编写 flights$ 代码告诉它覆盖分组并使用原始未分组向量。删除 flights$ .
  2. summarize 当需要每组一行时使用,但这里看起来我们想要一个与输入行数相同的结果,所以使用 mutate 而不是 summarize .
  3. 这里有不必要的括号,虽然它们并没有错,但会增加阅读难度。当表达式可能有歧义或依赖规则时,reader 可能必须查找,使用额外的括号是个好主意,但这里不是这种情况。
  4. ungroup 最后,所以我们没有留下分组数​​据框。
  5. dplyr 破坏了基础 R 中的 lagfilter,因此它会与许多其他软件包发生冲突。始终在 library 语句中排除这些。这不会影响这里的代码,因为它们都没有被使用,但作为预防措施,我总是这样做。
  6. 当代码仅使用 dplyr 及其依赖项时,似乎没有必要加载所有 tidyverse。
library(dplyr, exclude = c("lag", "filter"))
library(nycflights13)
library(zoo)

delay_rate <- flights %>% 
  group_by(year, month, day) %>%
  mutate(delay_rate = rollsumr(dep_delay, k = 7, fill = NA) / 
    rollsumr(arr_delay, k = 7, fill = NA)) %>%
  ungroup