用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,fill = NA)
)

解决方法

有几个问题:

  1. 通过编写flights$,代码告诉它覆盖分组并使用原始的未分组向量。删除flights$
  2. summarize用于需要每组一行的记录,但在这里看来我们想要的结果具有与输入相同的行数,因此请使用mutate而不是summarize。 / li>
  3. 这里有不需要的括号,尽管它们没错,但使它更难阅读。当表达式可能含糊不清或依赖规则时,读者可能不得不查找,最好使用多余的括号,但这不是这种情况。
  4. ungroup最后,所以我们没有分组的数据框。
  5. 基础R中的
  6. dplyr插件lagfilter,因此它将与许多其他软件包冲突。始终将它们排除在library语句中。这不会影响此处的代码,因为两者均未使用,但为预防起见,我总是这样做。
  7. 当代码仅使用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,fill = NA)) %>%
  ungroup