美文网首页R
R 数据处理(九)—— dplyr

R 数据处理(九)—— dplyr

作者: 名本无名 | 来源:发表于2021-01-20 08:55 被阅读0次

    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 思考练习

    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
       <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, 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
       <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 思考练习

    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
       <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 思考练习

    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

        本文链接:https://www.haomeiwen.com/subject/ovbhzktx.html