使用 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)
)
有几个问题:
- 通过编写
flights$
代码告诉它覆盖分组并使用原始未分组向量。删除 flights$
.
summarize
当需要每组一行时使用,但这里看起来我们想要一个与输入行数相同的结果,所以使用 mutate
而不是 summarize
.
- 这里有不必要的括号,虽然它们并没有错,但会增加阅读难度。当表达式可能有歧义或依赖规则时,reader 可能必须查找,使用额外的括号是个好主意,但这里不是这种情况。
ungroup
最后,所以我们没有留下分组数据框。
- dplyr 破坏了基础 R 中的
lag
和 filter
,因此它会与许多其他软件包发生冲突。始终在 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
假设我想计算 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)
)
有几个问题:
- 通过编写
flights$
代码告诉它覆盖分组并使用原始未分组向量。删除flights$
. summarize
当需要每组一行时使用,但这里看起来我们想要一个与输入行数相同的结果,所以使用mutate
而不是summarize
.- 这里有不必要的括号,虽然它们并没有错,但会增加阅读难度。当表达式可能有歧义或依赖规则时,reader 可能必须查找,使用额外的括号是个好主意,但这里不是这种情况。
ungroup
最后,所以我们没有留下分组数据框。- dplyr 破坏了基础 R 中的
lag
和filter
,因此它会与许多其他软件包发生冲突。始终在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