【问题标题】:Calculating (something similar to) moving averages with grouped data in R?用 R 中的分组数据计算(类似于)移动平均线?
【发布时间】:2020-10-18 02:22:46
【问题描述】:

假设我想计算 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)
)

【问题讨论】:

    标签: r group-by tidyverse zoo


    【解决方案1】:

    有几个问题:

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

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      相关资源
      最近更新 更多