问题描述
假设我要计算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)
)
解决方法
有几个问题:
- 通过编写
flights$
,代码告诉它覆盖分组并使用原始的未分组向量。删除flights$
。 -
summarize
用于需要每组一行的记录,但在这里看来我们想要的结果具有与输入相同的行数,因此请使用mutate
而不是summarize
。 / li> - 这里有不需要的括号,尽管它们没错,但使它更难阅读。当表达式可能含糊不清或依赖规则时,读者可能不得不查找,最好使用多余的括号,但这不是这种情况。
-
ungroup
最后,所以我们没有分组的数据框。
基础R中的 - dplyr插件
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,fill = NA)) %>%
ungroup