R 数据处理(九)—— dplyr

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
                                                
 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 , origin , dest ,
#   air_time , distance , hour , minute , time_hour 

使用 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
                                                
 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 , origin , dest ,
#   air_time , distance , hour , minute , time_hour 

缺失值总是排在最后

> df <- tibble(x = c(5, 2, NA))
> arrange(df, x)
# A tibble: 3 x 1
      x
  
1     2
2     5
3    NA
> arrange(df, desc(x))
# A tibble: 3 x 1
      x
  
1     5
2     2
3    NA

3.1 思考练习

  1. 如何使用 arrange() 将所有缺失的值排在开头位置?(提示:使用 is.na()
  2. 对航班进行排序,找出延误最多的航班。找到最早起飞的航班。
  3. 对航班进行排序,找出最快(速度最快)的航班。
  4. 哪个航班飞行最远?哪一个飞行最短?

4 select

获取包含数百上千个变量的数据并不少见。在这种情况下,第一个挑战往往是缩小你真正感兴趣的变量范围

select() 允许您使用基于变量名称的操作快速提取一个子集。

select() 对于 flights 数据不是很有用,因为只有 19 个变量,但是用法是一致的

# 按名称选择列
> select(flights, year, month, day)
# A tibble: 336,776 x 3
    year month   day
     
 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
     
 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
                                                  
 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 , air_time , distance ,
#   hour , minute , time_hour 
> 

有许多辅助函数可以在 select() 中使用

  • starts_with("abc"): 匹配以 abc 开头的列名

  • ends_with("xyz"): 匹配 xyz 结尾的列名

  • contains("ijk"): 匹配包含 ijk 的列名

  • matches("(.)\\1"): 正则表达式匹配列名,它匹配任何包含重复字符的变量,记住需要对 \ 进行转义

  • num_range("x", 1:3): 匹配 x1, x2x3

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
                                                
 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 , origin , dest ,
#   air_time , distance , hour , minute , time_hour 

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
                                              
 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 , arr_delay ,
#   carrier , flight , tailnum , origin , dest , distance , hour ,
#   minute 

4.1 思考练习

  1. 想出尽可能多的方法从航班中选择 dep_timedep_delayarr_timearr_dela
  2. 如果在 select() 多次调用变量名会发生什么?
  3. any_of() 函数的作用是什么? 为什么和下面这个向量结合起来会有帮助呢?
vars <- c("year", "month", "day", "dep_delay", "arr_delay")
  1. 以下代码运行的结果会让您感到惊讶吗?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
                         
 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
                                  
 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
             
 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 思考练习

  1. 目前,dep_timesched_dep_time 便于查看,但是很难计算,因为它们并不是真正的连续数字(517 => 5:17)。将它们转换成更方便的分钟数

  2. 比较 air_timearr_time - dep_time,你期望看到什么结果?但是输出了什么结果?该怎么解决这个问题

  3. 比较 dep_time, sched_dep_timedep_delay,你觉得这三个数字会有什么联系?

  4. 使用排名函数找出延误次数最多的 10 个航班,你想怎样处理(min_rank()

  5. 1:3 + 1:10 返回什么?为什么?

  6. R 提供了什么三角函数?

感谢花花同学的上期参考答案:

http://note.youdao.com/s/NXHvKdvA

你可能感兴趣的:(R 数据处理(九)—— dplyr)