首页 > 解决方案 > 用 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)
)

标签: rgroup-bytidyversezoo

解决方案


有几个问题:

  1. 通过编写flights$代码告诉它覆盖分组并使用原始的未分组向量。删除flights$.
  2. summarize当需要每组一行时使用,但在这里看起来我们想要一个与输入具有相同行数的结果,因此使用mutate而不是summarize.
  3. 这里有不需要的括号,虽然它们没有错,但它使阅读变得更加困难。当表达式可能不明确或依赖于规则时,读者可能不得不查找,使用额外的括号是一个好主意,但这里的情况并非如此。
  4. ungroup最后,我们没有留下分组数​​据框。
  5. dplyr clobberslag并且filter在基础 R 中,所以它会与许多其他包冲突。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

推荐阅读