r - 用 R 中的分组数据计算(类似于)移动平均线?
问题描述
假设我想计算 nycflights13 中航班的 dep_delay 和 arr_delay 之间过去 7 天的比率。我尝试了以下方法,但是一旦我将动物园中的任何功能放入管道中,它似乎就完全取消了数据分组。
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)
)
解决方案
有几个问题:
- 通过编写
flights$
代码告诉它覆盖分组并使用原始的未分组向量。删除flights$
. summarize
当需要每组一行时使用,但在这里看起来我们想要一个与输入具有相同行数的结果,因此使用mutate
而不是summarize
.- 这里有不需要的括号,虽然它们没有错,但它使阅读变得更加困难。当表达式可能不明确或依赖于规则时,读者可能不得不查找,使用额外的括号是一个好主意,但这里的情况并非如此。
ungroup
最后,我们没有留下分组数据框。- dplyr clobbers
lag
并且filter
在基础 R 中,所以它会与许多其他包冲突。library
始终在声明中排除这些。这不会影响这里的代码,因为它们都没有使用,但作为预防措施,我总是这样做。 - 当代码仅使用 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