R中逻辑列中的TRUE值时增加计数器

山姆·拉费尔

我正在研究R4DS,目前正在进行5.6.7练习(https://r4ds.had.co.nz/transform.html#exercises-11)。

这里的第一点要求考虑一些有关典型航班延误特性的方案。第一个子项目是“航班在50%的时间早15分钟,在50%的时间晚15分钟”。

我想在“ nycflights13”数据集中找到具有相等数量的晚到达时间15分钟以及早到达时间15分钟的航班。

至此,我创建了一个新的数据框,其中仅包含年,月,日,尾号和到达延迟。我还使用dplyr进行了变异,并添加了“ 15_min_delay”和“ 15_min_early”逻辑列。

接下来,我使用plyr进行过滤以创建一个新的数据框,该数据框仅包含提前15分钟或延迟15分钟的航班。

从这里开始,我想对tailnum进行group_by,发现我有大约2.7k个唯一的tailnum,但是我有9266个观测值。因此,我知道将重复一些尾巴。

创建完成后r odd_delays_new,我迷路了。我尝试创建一个带有ifelse的for循环,以遍历所有9,266个观察值,并为延迟计数器或早期计数器+1,但这给了我一个错误。

odd_delays <- flights %>%
  select(year, month, day, tailnum, arr_delay) %>%
  mutate("15_minute_delay" = arr_delay == 15, "15_minute_early" = arr_delay == -15)
length(odd_delays$"15_minute_delay"[odd_delays$"15_minute_delay" == TRUE])
length(odd_delays$"15_minute_early"[odd_delays$"15_minute_early" == TRUE])
odd_delays_new <- odd_delays %>%
  filter(odd_delays$`15_minute_delay` == TRUE | odd_delays$`15_minute_early` == TRUE)
  ifelse(odd_delays_new$`15_minute_delay` == TRUE, delay = delay + 1, early = early + 1)

我希望结果是3列数据框。第一列将包含尾号,第二列将包含飞机延迟15分钟到达的次数,第三列将包含飞机提前15分钟到达的次数。

its84

我将分两部分回答。

  • 我将如何处理
  • for循环的替代方法。

解决问题

要回答您的问题,您可以留在dplyr管道内。我相信这本书的意思是至少早/晚15分钟,所以我用了>=<=您想了解延迟/早到与总数的关系,因此您需要首先找到分母。n()是基于分组的观察数。然后,我使用sum()这些逻辑结果。如果您要求sum()或进行其他数学运算,R会将逻辑值视为0,1

off_schedule <-
  flights %>%
  group_by(tailnum) %>% 
  summarise(
    n = n(),
    delay_15min = sum(arr_delay >= 15, na.rm = TRUE),
    early_15min = sum(arr_delay <= -15, na.rm = TRUE)
  ) %>% 
  ungroup() %>% 
  mutate(
    delay_pct = delay_15min/n*100,
    early_pct = early_15min/n*100,
    off_pct = delay_pct + early_pct
  )

这给我们下表:

# tailnum       n delay_15min early_15min delay_pct early_pct off_pct
#   <chr>   <int>       <int>       <int>     <dbl>     <dbl>   <dbl>
#  D942DN      4           2           0     50          0      50  
#  N0EGMQ    371          95          73     25.6       19.7    45.3
#  N10156    153          51          34     33.3       22.2    55.6
#  N102UW     48           7          13     14.6       27.1    41.7
#  N103US     46           2          13      4.35      28.3    32.6

for循环

为了使循环正常工作,您必须使用索引值。

for (i in 1:nrow(odd_delays)){  
  if(odd_delays_new$`15_minute_delay`[i] == TRUE){
    odd_delays_new$delay[i] <- odd_delays_new$delay[i-1] + 1
  } 

  if(odd_delays_new$`15_minute_early`[i] == TRUE){
    odd_delays_new$early[i] <- odd_delays_new$early[i-1] + 1
  } 
}

三年后写作或阅读都不好玩。幸运的是,该cumsum()函数可以将它们相加:

df <-
  odd_delays_new %>% 
  group_by(tailnum) %>% 
  mutate(
    delay = cumsum(`15_minute_delay`),
    early = cumsum(`15_minute_early`)
  ) %>% 
  ungroup()

但是,该解决方案并不能帮助您了解航班延误的频率N0EGMQ,而只是告诉您N0EGMQ航班延误航班,延误与提前到达之间的关系。

我希望这有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单击java脚本中的按钮时如何增加计数器值

在字典中增加计数器的最快方法

如何在SQLAlchemy中增加计数器

在recyclerview(的cardview)中单击按钮增加计数器

如何在CSS代码中增加计数器?

在递归函数调用中增加计数器

如何在JavaScript中的类内增加计数器值

在React.js中单击鼠标时不断增加计数器

单击ng-repeat中的项目时如何增加计数器?

React-当按钮增加并在另一页面中呈现结果时,最佳计数器会增加计数器?

使用C#在onClick中两个文本框值相等时如何增加计数器值

R在值列中的每次更改均增加1,然后重新启动计数器

单击按钮时增加计数器值,然后重新使用值

如何在javascript中的新窗口中打开链接并仅在单击按钮时增加计数器?

如何通过单击按钮增加计数器的值?

单击正确的图像时如何增加计数器

Firebase如何在离线时增加计数器?

在python中分配计数器时增加计数器

重击:在字符串中增加计数器变量

在 SQL SELECT Case 语句查询中增加计数器

如果列表理解中的某些条件为真,如何增加计数器?

如何在 Flutter 中增加计数器并禁用按钮?

如何使用 MongoDB 数据源在 LoopBack 4 中增加计数器变量?

初始化字典,循环浏览列表,在字典中添加单词并增加计数器

如何在Flutter中为特定列表项增加计数器?

如何在不同的进程python中增加计数器?

在Java和C ++中增加计数器的最佳方法?

否则如何在jsp中的星号之间使用advance增加计数器?

为什么在Cassandra中增加计数器时会看到“读取”?