在dplyr中使用过滤器为所有行生成值

时间:2017-12-12 22:42:28

标签: r dplyr

library(tidyverse)
library(nycflights13)
nycflights13::flights

如果以下表达式每天从数据集中提供航班:

daily <- dplyr::group_by( flights, year, month, day)
(per_day <- dplyr::summarize( daily, flights = n()))

我希望取消航班的类似内容:

canx <- dplyr::filter( flights, is.na(dep_time) & is.na(arr_time))
canx2 <- canx %>% dplyr::group_by( year, month, day) 

我的目标是拥有与所有汇总航班相同的数据框长度。

我每天都可以取消航班数量:

(canx_day <- dplyr::summarize( canx2, flights = n()))

但显然这是一个稍短的数据框,所以我无法运行例如:

canx_day$propcanx <- per_day$flights/canx_day$flights

即使我介绍了NA,我也可以替换它们。

所以我的问题是,如果我不使用过滤器,或者是否有过滤我应该应用的参数?

非常感谢

3 个答案:

答案 0 :(得分:3)

您不应该使用filter。正如其他人所说,使用canceled列很容易,因此我们的第一步是创建该列。然后,您可以使用单个summarize轻松获得所需内容。例如:

flights %>% 
    mutate(canceled = as.integer(is.na(dep_time) & is.na(arr_time))) %>%
    group_by(year, month, day) %>%
    summarize(n_scheduled = n(),
              n_not_canceled = sum(!canceled),
              n_canceled = sum(canceled),
              prop_canceled = mean(canceled))
# # A tibble: 365 x 7
# # Groups:   year, month [?]
#     year month   day n_scheduled n_not_canceled n_canceled prop_canceled
#    <int> <int> <int>       <int>          <int>      <int>         <dbl>
#  1  2013     1     1         842            838          4   0.004750594
#  2  2013     1     2         943            935          8   0.008483563
#  3  2013     1     3         914            904         10   0.010940919
#  4  2013     1     4         915            909          6   0.006557377
#  5  2013     1     5         720            717          3   0.004166667
#  6  2013     1     6         832            831          1   0.001201923
#  7  2013     1     7         933            930          3   0.003215434
#  8  2013     1     8         899            895          4   0.004449388
# ...

答案 1 :(得分:0)

这为您提供flight, year, month, day

每天的航班和取消的航班
nycflights13::flights %>% 
  group_by(flight, year, month, day) %>% 
  summarize(per_day = n(),
            canx = sum(ifelse(is.na(arr_time), 1, 0)))

答案 2 :(得分:-2)

有一种简单的方法可以计算每天取消的航班数量。让我们假设取消航班的Cancelled列为TRUE。如果是这样,那么计算每日取消航班的方式将是:

flights %>%
group_by(year, month, day) %>%
summarize( canx_day = sum(Cancelled))

canx_day将包含一天取消的航班。