如何在一个data.table调用中对行进行子集和排序?

时间:2017-09-30 06:25:06

标签: r data.table

我正在学习data.table,并尝试在计算平均值时对分组数据进行子集和重新排序,所有这些都在一个data.table语句中。

我从here获得了tutorial的航班数据。

从教程

开始

如何为运营商代码“AA”获取每个月份的每个orig,dest对的平均到达和离开延迟?

ans <- flights[carrier == "AA",
        .(mean(arr_delay), mean(dep_delay)),
        by = .(origin, dest, month)]
ans
#      origin dest month         V1         V2
#   1:    JFK  LAX     1   6.590361 14.2289157
#   2:    LGA  PBI     1  -7.758621  0.3103448
#   3:    EWR  LAX     1   1.366667  7.5000000
#   4:    JFK  MIA     1  15.720670 18.7430168
#   5:    JFK  SEA     1  14.357143 30.7500000
#  ---                                        
# 196:    LGA  MIA    10  -6.251799 -1.4208633
# 197:    JFK  MIA    10  -1.880184  6.6774194
# 198:    EWR  PHX    10  -3.032258 -4.2903226
# 199:    JFK  MCO    10 -10.048387 -1.6129032
# 200:    JFK  DCA    10  16.483871 15.5161290

这对我有意义。但是,我想通过组织一起离开同一个起源的航班来改进这一点。遵循......

的架构
data.table(subset, select/compute, group by)

我想出了这个:

flights[(carrier=="AA")[order(origin, dest)], 
       .(Arrival_Delay=mean(arr_delay), Depart_Delay=mean(dep_delay)), 
       by=.(origin, dest, month)]

但我对订单的要求似乎没有做任何事情。为什么呢?

我可以在dplyr中实现:

 flights %>%
  filter(carrier=="AA") %>%
  group_by(origin, dest, month) %>%
  summarize(Arrival_Delay=mean(arr_delay), Depart_Delay=mean(dep_delay)) %>%
  as.data.table()

我很好奇如何在data.table中执行此操作以及为什么我的方法不起作用。

1 个答案:

答案 0 :(得分:4)

使用data.table时,如果要在by操作后对结果进行排序,可以使用keyby。来自help("data.table", package = "data.table")

  

keyby
  与by相同,但为方便起见,在结果的by列上运行了另外的setkey()。 通常的做法是使用&#39; keyby =&#39;通常希望对结果进行排序。

然后,您可以在代码中使用keyby代替by


library(data.table)
# get the data from the web
flights <- fread("https://github.com/arunsrinivasan/flights/wiki/NYCflights14/flights14.csv")
# keyby will call setkey and then sort your result
ans <- flights[carrier == "AA",
               .(mean(arr_delay), mean(dep_delay)),
               keyby = .(origin, dest, month)]
ans
#>      origin dest month         V1         V2
#>   1:    EWR  DFW     1   6.427673 10.0125786
#>   2:    EWR  DFW     2  10.536765 11.3455882
#>   3:    EWR  DFW     3  12.865031  8.0797546
#>   4:    EWR  DFW     4  17.792683 12.9207317
#>   5:    EWR  DFW     5  18.487805 18.6829268
#>  ---                                        
#> 196:    LGA  PBI     1  -7.758621  0.3103448
#> 197:    LGA  PBI     2  -7.865385  2.4038462
#> 198:    LGA  PBI     3  -5.754098  3.0327869
#> 199:    LGA  PBI     4 -13.966667 -4.7333333
#> 200:    LGA  PBI     5 -10.357143 -6.8571429