3 arrange
arrange()
的工作原理与 filter()
类似,只是它不选择行,而是更改行的顺序
它需要传入一个数据框和一组列名(或更复杂的表达式)来排序。如果你提供了多个列名,每个额外的列将被用来打破前面列值的联系
> arrange(flights, year, month, day)
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int>
1 2013 1 1 517 515 2 830 819 11 UA 1545
2 2013 1 1 533 529 4 850 830 20 UA 1714
3 2013 1 1 542 540 2 923 850 33 AA 1141
4 2013 1 1 544 545 -1 1004 1022 -18 B6 725
5 2013 1 1 554 600 -6 812 837 -25 DL 461
6 2013 1 1 554 558 -4 740 728 12 UA 1696
7 2013 1 1 555 600 -5 913 854 19 B6 507
8 2013 1 1 557 600 -3 709 723 -14 EV 5708
9 2013 1 1 557 600 -3 838 846 -8 B6 79
10 2013 1 1 558 600 -2 753 745 8 AA 301
# … with 336,766 more rows, and 8 more variables: tailnum <chr>, origin <chr>, dest <chr>,
# air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
使用 desc()
按降序重新排序
> arrange(flights, desc(dep_delay))
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int>
1 2013 1 9 641 900 1301 1242 1530 1272 HA 51
2 2013 6 15 1432 1935 1137 1607 2120 1127 MQ 3535
3 2013 1 10 1121 1635 1126 1239 1810 1109 MQ 3695
4 2013 9 20 1139 1845 1014 1457 2210 1007 AA 177
5 2013 7 22 845 1600 1005 1044 1815 989 MQ 3075
6 2013 4 10 1100 1900 960 1342 2211 931 DL 2391
7 2013 3 17 2321 810 911 135 1020 915 DL 2119
8 2013 6 27 959 1900 899 1236 2226 850 DL 2007
9 2013 7 22 2257 759 898 121 1026 895 DL 2047
10 2013 12 5 756 1700 896 1058 2020 878 AA 172
# … with 336,766 more rows, and 8 more variables: 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))
> arrange(df, x)
# A tibble: 3 x 1
x
<dbl>
1 2
2 5
3 NA
> arrange(df, desc(x))
# A tibble: 3 x 1
x
<dbl>
1 5
2 2
3 NA
3.1 思考练习
- 如何使用
arrange()
将所有缺失的值排在开头位置?(提示:使用is.na()
) - 对航班进行排序,找出延误最多的航班。找到最早起飞的航班。
- 对航班进行排序,找出最快(速度最快)的航班。
- 哪个航班飞行最远?哪一个飞行最短?
4 select
获取包含数百上千个变量的数据并不少见。在这种情况下,第一个挑战往往是缩小你真正感兴趣的变量范围
select()
允许您使用基于变量名称的操作快速提取一个子集。
select()
对于 flights
数据不是很有用,因为只有 19
个变量,但是用法是一致的
# 按名称选择列
> select(flights, year, month, day)
# A tibble: 336,776 x 3
year month day
<int> <int> <int>
1 2013 1 1
2 2013 1 1
3 2013 1 1
4 2013 1 1
5 2013 1 1
6 2013 1 1
7 2013 1 1
8 2013 1 1
9 2013 1 1
10 2013 1 1
# … with 336,766 more rows
# 选取 year 和 day 之间的列
> select(flights, year:day)
# A tibble: 336,776 x 3
year month day
<int> <int> <int>
1 2013 1 1
2 2013 1 1
3 2013 1 1
4 2013 1 1
5 2013 1 1
6 2013 1 1
7 2013 1 1
8 2013 1 1
9 2013 1 1
10 2013 1 1
# … with 336,766 more rows
# 选取所有除了 year 到 day 的列
> select(flights, -(year:day))
# A tibble: 336,776 x 16
dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin
<int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr>
1 517 515 2 830 819 11 UA 1545 N14228 EWR
2 533 529 4 850 830 20 UA 1714 N24211 LGA
3 542 540 2 923 850 33 AA 1141 N619AA JFK
4 544 545 -1 1004 1022 -18 B6 725 N804JB JFK
5 554 600 -6 812 837 -25 DL 461 N668DN LGA
6 554 558 -4 740 728 12 UA 1696 N39463 EWR
7 555 600 -5 913 854 19 B6 507 N516JB EWR
8 557 600 -3 709 723 -14 EV 5708 N829AS LGA
9 557 600 -3 838 846 -8 B6 79 N593JB JFK
10 558 600 -2 753 745 8 AA 301 N3ALAA LGA
# … with 336,766 more rows, and 6 more variables: dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
>
有许多辅助函数可以在 select()
中使用
-
starts_with("abc")
: 匹配以abc
开头的列名 -
ends_with("xyz")
: 匹配xyz
结尾的列名 -
contains("ijk")
: 匹配包含ijk
的列名 -
matches("(.)\\1")
: 正则表达式匹配列名,它匹配任何包含重复字符的变量,记住需要对\
进行转义 -
num_range("x", 1:3)
: 匹配x1
,x2
和x3
select()
可以用来重命名变量,但很少用到它,因为它会删除所有没有显式提到的变量
可以使用 rename()
,它是 select()
的一个变体,保存所有未显式提到的变量
> rename(flights, tail_num = tailnum)
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int>
1 2013 1 1 517 515 2 830 819 11 UA 1545
2 2013 1 1 533 529 4 850 830 20 UA 1714
3 2013 1 1 542 540 2 923 850 33 AA 1141
4 2013 1 1 544 545 -1 1004 1022 -18 B6 725
5 2013 1 1 554 600 -6 812 837 -25 DL 461
6 2013 1 1 554 558 -4 740 728 12 UA 1696
7 2013 1 1 555 600 -5 913 854 19 B6 507
8 2013 1 1 557 600 -3 709 723 -14 EV 5708
9 2013 1 1 557 600 -3 838 846 -8 B6 79
10 2013 1 1 558 600 -2 753 745 8 AA 301
# … with 336,766 more rows, and 8 more variables: tail_num <chr>, origin <chr>, dest <chr>,
# air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
将 select()
与 everything()
辅助函数结合使用。可以将一些变量移到数据框的开头或结尾
> select(flights, time_hour, air_time, everything())
# A tibble: 336,776 x 19
time_hour air_time year month day dep_time sched_dep_time dep_delay arr_time
<dttm> <dbl> <int> <int> <int> <int> <int> <dbl> <int>
1 2013-01-01 05:00:00 227 2013 1 1 517 515 2 830
2 2013-01-01 05:00:00 227 2013 1 1 533 529 4 850
3 2013-01-01 05:00:00 160 2013 1 1 542 540 2 923
4 2013-01-01 05:00:00 183 2013 1 1 544 545 -1 1004
5 2013-01-01 06:00:00 116 2013 1 1 554 600 -6 812
6 2013-01-01 05:00:00 150 2013 1 1 554 558 -4 740
7 2013-01-01 06:00:00 158 2013 1 1 555 600 -5 913
8 2013-01-01 06:00:00 53 2013 1 1 557 600 -3 709
9 2013-01-01 06:00:00 140 2013 1 1 557 600 -3 838
10 2013-01-01 06:00:00 138 2013 1 1 558 600 -2 753
# … with 336,766 more rows, and 10 more variables: sched_arr_time <int>, arr_delay <dbl>,
# carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>, distance <dbl>, hour <dbl>,
# minute <dbl>
4.1 思考练习
- 想出尽可能多的方法从航班中选择
dep_time
、dep_delay
、arr_time
和arr_dela
列 - 如果在
select()
多次调用变量名会发生什么? -
any_of()
函数的作用是什么? 为什么和下面这个向量结合起来会有帮助呢?
vars <- c("year", "month", "day", "dep_delay", "arr_delay")
- 以下代码运行的结果会让您感到惊讶吗?
select
如何处理默认情况?如何更改默认行为?
select(flights, contains("TIME"))
5 mutate
除了选择现有的列之外,添加与现有列相关的新列通常也很有用。这就是 mutate()
的作用
mutate()
总是在数据集的末尾添加新列,因此我们将首先创建一个更窄的数据集,以便可以看到新变量
> flights_sml <- select(flights,
+ year:day,
+ ends_with("delay"),
+ distance,
+ air_time
+ )
> mutate(flights_sml,
+ gain = dep_delay - arr_delay,
+ speed = distance / air_time * 60
+ )
# A tibble: 336,776 x 9
year month day dep_delay arr_delay distance air_time gain speed
<int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2013 1 1 2 11 1400 227 -9 370.
2 2013 1 1 4 20 1416 227 -16 374.
3 2013 1 1 2 33 1089 160 -31 408.
4 2013 1 1 -1 -18 1576 183 17 517.
5 2013 1 1 -6 -25 762 116 19 394.
6 2013 1 1 -4 12 719 150 -16 288.
7 2013 1 1 -5 19 1065 158 -24 404.
8 2013 1 1 -3 -14 229 53 11 259.
9 2013 1 1 -3 -8 944 140 5 405.
10 2013 1 1 -2 8 733 138 -10 319.
# … with 336,766 more rows
注意: 你可以在 mutate()
中引用你刚刚创建的列
> mutate(flights_sml,
+ gain = dep_delay - arr_delay,
+ hours = air_time / 60,
+ gain_per_hour = gain / hours
+ )
# A tibble: 336,776 x 10
year month day dep_delay arr_delay distance air_time gain hours gain_per_hour
<int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2013 1 1 2 11 1400 227 -9 3.78 -2.38
2 2013 1 1 4 20 1416 227 -16 3.78 -4.23
3 2013 1 1 2 33 1089 160 -31 2.67 -11.6
4 2013 1 1 -1 -18 1576 183 17 3.05 5.57
5 2013 1 1 -6 -25 762 116 19 1.93 9.83
6 2013 1 1 -4 12 719 150 -16 2.5 -6.4
7 2013 1 1 -5 19 1065 158 -24 2.63 -9.11
8 2013 1 1 -3 -14 229 53 11 0.883 12.5
9 2013 1 1 -3 -8 944 140 5 2.33 2.14
10 2013 1 1 -2 8 733 138 -10 2.3 -4.35
# … with 336,766 more rows
如果你只想保留这些新变量,请使用 transmute()
> transmute(flights,
+ gain = dep_delay - arr_delay,
+ hours = air_time / 60,
+ gain_per_hour = gain / hours
+ )
# A tibble: 336,776 x 3
gain hours gain_per_hour
<dbl> <dbl> <dbl>
1 -9 3.78 -2.38
2 -16 3.78 -4.23
3 -31 2.67 -11.6
4 17 3.05 5.57
5 19 1.93 9.83
6 -16 2.5 -6.4
7 -24 2.63 -9.11
8 11 0.883 12.5
9 5 2.33 2.14
10 -10 2.3 -4.35
# … with 336,766 more rows
5.1 思考练习
-
目前,
dep_time
和sched_dep_time
便于查看,但是很难计算,因为它们并不是真正的连续数字(517 => 5:17
)。将它们转换成更方便的分钟数 -
比较
air_time
和arr_time - dep_time
,你期望看到什么结果?但是输出了什么结果?该怎么解决这个问题 -
比较
dep_time
,sched_dep_time
和dep_delay
,你觉得这三个数字会有什么联系? -
使用排名函数找出延误次数最多的
10
个航班,你想怎样处理(min_rank()
) -
1:3 + 1:10
返回什么?为什么? -
R
提供了什么三角函数?
感谢花花同学的上期参考答案:
网友评论