1.2 arrange()
arrange()
的工作方式与 filter()
非常相似,但它不是筛选行,而是改变行的顺序。它接受一个数据集和一组作为排序依据的列名(或者更复杂的表达式)作为参数,如果列名不止一个,那么就是用后面的列在前面排序的基础上继续排序:
# 依次按照 year -> month -> day 三个变量按升序排序
flights %>% arrange(year, month, day)
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 1 517 515 2 830 819
#> 2 2013 1 1 533 529 4 850 830
#> 3 2013 1 1 542 540 2 923 850
#> 4 2013 1 1 544 545 -1 1004 1022
#> 5 2013 1 1 554 600 -6 812 837
#> 6 2013 1 1 554 558 -4 740 728
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
如果想要按某列降序排列行,可以对该列名使用函数desc()
:
flights %>% arrange(desc(arr_delay)) ## 按照到达延误时间从大到小排序
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 9 641 900 1301 1242 1530
#> 2 2013 6 15 1432 1935 1137 1607 2120
#> 3 2013 1 10 1121 1635 1126 1239 1810
#> 4 2013 9 20 1139 1845 1014 1457 2210
#> 5 2013 7 22 845 1600 1005 1044 1815
#> 6 2013 4 10 1100 1900 960 1342 2211
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
缺失值总是排在最后:
df <- tibble(x = c(5, 2, NA))
df %>% arrange(x)
#> # A tibble: 3 x 1
#> x
#> <dbl>
#> 1 2
#> 2 5
#> 3 NA
如果参数是一个关于某些列的表达式 expression(var)
,它的意思是告诉 arrange()
:“按照各行在这个表达式上的取值的从小到大的顺序排列观测
# dep_delay的绝对值小的行被排在前面
flights %>% arrange((dep_delay ** 2))
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 1 559 559 0 702 706
#> 2 2013 1 1 600 600 0 851 858
#> 3 2013 1 1 600 600 0 837 825
#> 4 2013 1 1 607 607 0 858 915
#> 5 2013 1 1 615 615 0 1039 1100
#> 6 2013 1 1 615 615 0 833 842
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
例如,我们希望找到总延误时间(dep_delay
+ arr_delay
)最长的航班
## 延误时间最长的航班
flights %>% arrange(desc(arr_delay + dep_delay))
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 9 641 900 1301 1242 1530
#> 2 2013 6 15 1432 1935 1137 1607 2120
#> 3 2013 1 10 1121 1635 1126 1239 1810
#> 4 2013 9 20 1139 1845 1014 1457 2210
#> 5 2013 7 22 845 1600 1005 1044 1815
#> 6 2013 4 10 1100 1900 960 1342 2211
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
如果A行在两个量上的取值是(2,5),B行是(1,10),B会出现在A后面,因为arrange()
按照这个表达式来进行排列。
1.2.1 Exercises
Exercise 1.4 如何使用
例:把 flights 数据集中
arrange()
将缺失值排在最前面?(提示:使用is.na()
)例:把 flights 数据集中
dep_time
上的 NA 值排在最前面( to sort the data frame by departure time (dep_time) in ascending order but NA values first)
首先is.na(dep_time)
将把所有 NA
变为 TRUE
(1),其他数值变成 FALSE
(0),所以 desc(is.na(dep_time))
是一个排序依据,它告诉 arrange()
,把那些经过运算is.na(dep_time)
后值大的行排在前面,即原先的 NA ; 之后,我们仍希望在那些不含 NA
的观测中按照 dep_time
排序,所以添加一个参数 dep_time
:
flights %>%
arrange(desc(is.na(dep_time)), dep_time)
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 1 NA 1630 NA NA 1815
#> 2 2013 1 1 NA 1935 NA NA 2240
#> 3 2013 1 1 NA 1500 NA NA 1825
#> 4 2013 1 1 NA 600 NA NA 901
#> 5 2013 1 2 NA 1540 NA NA 1747
#> 6 2013 1 2 NA 1620 NA NA 1746
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Exercise 1.5 对
flights
排序以找出延误时间最长的航班。找出出发时间最早的航班。
# 延误时间最长的航班
flights %>% arrange(desc(dep_delay))
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 9 641 900 1301 1242 1530
#> 2 2013 6 15 1432 1935 1137 1607 2120
#> 3 2013 1 10 1121 1635 1126 1239 1810
#> 4 2013 9 20 1139 1845 1014 1457 2210
#> 5 2013 7 22 845 1600 1005 1044 1815
#> 6 2013 4 10 1100 1900 960 1342 2211
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
# 出发时间最早的航班
flights %>% arrange(dep_time)
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 13 1 2249 72 108 2357
#> 2 2013 1 31 1 2100 181 124 2225
#> 3 2013 11 13 1 2359 2 442 440
#> 4 2013 12 16 1 2359 2 447 437
#> 5 2013 12 20 1 2359 2 430 440
#> 6 2013 12 26 1 2359 2 437 440
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Exercise 1.6 对
flights
排序以找出速度最快的航班
这个排序条件需要用到表达式,速度 = distance / air_time
flights %>% arrange(distance / air_time)
#> # A tibble: 336,776 x 19
#> year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <int> <int> <int> <dbl> <int> <int>
#> 1 2013 1 28 1917 1825 52 2118 1935
#> 2 2013 6 29 755 800 -5 1035 909
#> 3 2013 8 28 932 940 -8 1116 1051
#> 4 2013 1 30 1037 955 42 1221 1100
#> 5 2013 11 27 556 600 -4 727 658
#> 6 2013 5 21 558 600 -2 721 657
#> # ... with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>