• 用R的dplyr进行数据转换(一)


    在网上找了很久关于数据转换的,都没有找到比较好的。现在为大家整理一下。按照我自己的思路。当然也是为了自己做笔记。

    为了方便,大家可以统一安装一个系列的包,这个只需要安装tidyverse这个包就可以,它会安装一系列的数据处理的包,比如ggplot2,dplyr等主力的包。

    #安装tidyverse包
    install.packages('tidyverse')
    #加载这个包
    library(tidyverse)
    

      我现在使用的版本如下:

    #需要先安装devtools这个包
    > devtools::session_info(c('tidyverse'))
    Session info -------------------------------------------------------------------------------
     setting  value                         
     version  R version 3.4.4 (2018-03-15)  
     system   x86_64, mingw32               
     ui       RStudio (1.1.442)             
     language (EN)                          
     collate  Chinese (Simplified)_China.936
     tz       Asia/Taipei                   
     date     2018-04-11                    
    
    Packages -----------------------------------------------------------------------------------
     package      * version   date       source        
     assertthat     0.2.0     2017-04-11 CRAN (R 3.4.4)
     backports      1.1.2     2017-12-13 CRAN (R 3.4.3)
     base64enc      0.1-3     2015-07-28 CRAN (R 3.4.1)
     BH             1.66.0-1  2018-02-13 CRAN (R 3.4.3)
     bindr          0.1.1     2018-03-13 CRAN (R 3.4.4)
     bindrcpp       0.2       2017-06-17 CRAN (R 3.4.4)
     broom          0.4.3     2017-11-20 CRAN (R 3.4.3)
     callr          2.0.2     2018-02-11 CRAN (R 3.4.4)
     cellranger     1.1.0     2016-07-27 CRAN (R 3.4.4)
     cli            1.0.0     2017-11-05 CRAN (R 3.4.4)
     colorspace     1.3-2     2016-12-14 CRAN (R 3.4.4)
     compiler       3.4.4     2018-03-15 local         
     crayon         1.3.4     2017-09-16 CRAN (R 3.4.4)
     curl           3.1       2017-12-12 CRAN (R 3.4.3)
     DBI            0.8       2018-03-02 CRAN (R 3.4.4)
     dbplyr         1.2.1     2018-02-19 CRAN (R 3.4.4)
     debugme        1.1.0     2017-10-22 CRAN (R 3.4.4)
     dichromat      2.0-0     2013-01-24 CRAN (R 3.4.1)
     digest         0.6.15    2018-01-28 CRAN (R 3.4.3)
     dplyr          0.7.4     2017-09-28 CRAN (R 3.4.3)
     evaluate       0.10.1    2017-06-24 CRAN (R 3.4.4)
     forcats        0.3.0     2018-02-19 CRAN (R 3.4.4)
     foreign        0.8-69    2017-06-22 CRAN (R 3.4.4)
     ggplot2        2.2.1     2016-12-30 CRAN (R 3.4.4)
     glue           1.2.0     2017-10-29 CRAN (R 3.4.4)
     graphics     * 3.4.4     2018-03-15 local         
     grDevices    * 3.4.4     2018-03-15 local         
     grid           3.4.4     2018-03-15 local         
     gtable         0.2.0     2016-02-26 CRAN (R 3.4.4)
     haven          1.1.1     2018-01-18 CRAN (R 3.4.4)
     highr          0.6       2016-05-09 CRAN (R 3.4.4)
     hms            0.4.2     2018-03-10 CRAN (R 3.4.4)
     htmltools      0.3.6     2017-04-28 CRAN (R 3.4.4)
     httr           1.3.1     2017-08-20 CRAN (R 3.4.4)
     jsonlite       1.5       2017-06-01 CRAN (R 3.4.4)
     knitr          1.20      2018-02-20 CRAN (R 3.4.4)
     labeling       0.3       2014-08-23 CRAN (R 3.4.1)
     lattice        0.20-35   2017-03-25 CRAN (R 3.4.4)
     lazyeval       0.2.1     2017-10-29 CRAN (R 3.4.4)
     lubridate      1.7.2     2018-02-06 CRAN (R 3.4.3)
     magrittr       1.5       2014-11-22 CRAN (R 3.4.4)
     markdown       0.8       2017-04-20 CRAN (R 3.4.4)
     MASS           7.3-49    2018-02-23 CRAN (R 3.4.4)
     methods      * 3.4.4     2018-03-15 local         
     mime           0.5       2016-07-07 CRAN (R 3.4.1)
     mnormt         1.5-5     2016-10-15 CRAN (R 3.4.1)
     modelr         0.1.1     2017-07-24 CRAN (R 3.4.4)
     munsell        0.4.3     2016-02-13 CRAN (R 3.4.4)
     nlme           3.1-131.1 2018-02-16 CRAN (R 3.4.4)
     openssl        1.0.1     2018-03-03 CRAN (R 3.4.4)
     parallel       3.4.4     2018-03-15 local         
     pillar         1.2.1     2018-02-27 CRAN (R 3.4.4)
     pkgconfig      2.0.1     2017-03-21 CRAN (R 3.4.4)
     plogr          0.2.0     2018-03-25 CRAN (R 3.4.4)
     plyr           1.8.4     2016-06-08 CRAN (R 3.4.4)
     praise         1.0.0     2015-08-11 CRAN (R 3.4.4)
     psych          1.7.8     2017-09-09 CRAN (R 3.4.4)
     purrr          0.2.4     2017-10-18 CRAN (R 3.4.4)
     R6             2.2.2     2017-06-17 CRAN (R 3.4.4)
     RColorBrewer   1.1-2     2014-12-07 CRAN (R 3.4.1)
     Rcpp           0.12.16   2018-03-13 CRAN (R 3.4.4)
     readr          1.1.1     2017-05-16 CRAN (R 3.4.4)
     readxl         1.0.0     2017-04-18 CRAN (R 3.4.4)
     rematch        1.0.1     2016-04-21 CRAN (R 3.4.4)
     reprex         0.1.2     2018-01-26 CRAN (R 3.4.4)
     reshape2       1.4.3     2017-12-11 CRAN (R 3.4.4)
     rlang          0.2.0     2018-02-20 CRAN (R 3.4.4)
     rmarkdown      1.9       2018-03-01 CRAN (R 3.4.4)
     rprojroot      1.3-2     2018-01-03 CRAN (R 3.4.4)
     rstudioapi     0.7       2017-09-07 CRAN (R 3.4.4)
     rvest          0.3.2     2016-06-17 CRAN (R 3.4.4)
     scales         0.5.0     2017-08-24 CRAN (R 3.4.4)
     selectr        0.3-2     2018-03-05 CRAN (R 3.4.4)
     stats        * 3.4.4     2018-03-15 local         
     stringi        1.1.7     2018-03-12 CRAN (R 3.4.4)
     stringr        1.3.0     2018-02-19 CRAN (R 3.4.4)
     testthat       2.0.0     2017-12-13 CRAN (R 3.4.4)
     tibble         1.4.2     2018-01-22 CRAN (R 3.4.4)
     tidyr          0.8.0     2018-01-29 CRAN (R 3.4.4)
     tidyselect     0.2.4     2018-02-26 CRAN (R 3.4.4)
     tidyverse      1.2.1     2017-11-14 CRAN (R 3.4.4)
     tools          3.4.4     2018-03-15 local         
     utf8           1.1.3     2018-01-03 CRAN (R 3.4.4)
     utils        * 3.4.4     2018-03-15 local         
     viridisLite    0.3.0     2018-02-01 CRAN (R 3.4.4)
     whisker        0.3-2     2013-04-28 CRAN (R 3.4.4)
     withr          2.1.2     2018-03-15 CRAN (R 3.4.4)
     xml2           1.2.0     2018-01-24 CRAN (R 3.4.4)
     yaml           2.1.18    2018-03-08 CRAN (R 3.4.4)
    

      我们选取一个航班的数据集,这个数据在下面这个包里面,也需要安装

    #安装这个包
    install.packages('nycflights13')
    #加载这个包
    library(nycflights13)
    

      查看这个数据集(这个数据集包含2013年从纽约市出发的所有336778架航班)

    > flights
    # A tibble: 336,776 x 19
        year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay
       <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl>
     1  2013     1     1      517            515        2.      830            819       11.
     2  2013     1     1      533            529        4.      850            830       20.
     3  2013     1     1      542            540        2.      923            850       33.
     4  2013     1     1      544            545       -1.     1004           1022      -18.
     5  2013     1     1      554            600       -6.      812            837      -25.
     6  2013     1     1      554            558       -4.      740            728       12.
     7  2013     1     1      555            600       -5.      913            854       19.
     8  2013     1     1      557            600       -3.      709            723      -14.
     9  2013     1     1      557            600       -3.      838            846       -8.
    10  2013     1     1      558            600       -2.      753            745        8.
    # ... with 336,766 more rows, and 10 more variables: carrier <chr>, flight <int>,
    #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
    #   minute <dbl>, time_hour <dttm>
    

      这个数据集其实是tibbles格式的,和R的普通的data.frame格式不一样。但是差不多。在这个列名称的下面会有这列的格式,比如int是整形的,dbl是双精度型的,当然啦,R和别的语言不一样,我觉得不要太关注他们的数据格式,大概知道哪些是连续的、哪些是离散的、哪些是字符型的,当然在特殊的情况下,需要考虑,我们现在就暂时不考虑。

    好了好了,这些准备的东西就介绍到这吧。进入正题

     dplyr有几个主要的函数。如下:

    filter()——这个是按照他的值进行筛选

    arrange()——这个就是排序呀!

    select()——这个是通过变量名选择变量

    mutate()——这个是用现有的变量函数创建新变量

    summarize()——这个是将许多值折叠为单个摘要(通常和group_by()函数在一起用,别说是我说的,我就是先透漏一下)

    filter()函数

    > filter(flights,month == 1,day == 1)
    # A tibble: 842 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
     7  2013     1     1      555            600       -5.      913            854
     8  2013     1     1      557            600       -3.      709            723
     9  2013     1     1      557            600       -3.      838            846
    10  2013     1     1      558            600       -2.      753            745
    # ... with 832 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>
    

      上面这个意思很明显,就是选择在这数据集中,month等于1且day等于1的行。看吧,很简单吧,这个是生成一个新的数据,不对原来的数据框进行修改。

    例如:

    > (dec25 <- filter(flights,month == 1,day == 25))
    # A tibble: 922 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    25       15           1815      360.      208           1958
     2  2013     1    25       17           2249       88.      119           2357
     3  2013     1    25       26           1850      336.      225           2055
     4  2013     1    25      123           2000      323.      229           2101
     5  2013     1    25      123           2029      294.      215           2140
     6  2013     1    25      456            500       -4.      632            648
     7  2013     1    25      519            525       -6.      804            820
     8  2013     1    25      527            530       -3.      820            829
     9  2013     1    25      535            540       -5.      826            850
    10  2013     1    25      539            540       -1.     1006           1017
    # ... with 912 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>
    

      当然,也可以用一些逻辑符号,只要你逻辑清楚,都可以用,你只要保证你的数据集在filte()函数的最前面的位置,后面尽管添加约束条件。比如你可以这样做:

    > filter(flights,month == 11 | month == 12)#这个是选择month等于11和等于12的列
    # A tibble: 55,403 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    11     1        5           2359        6.      352            345
     2  2013    11     1       35           2250      105.      123           2356
     3  2013    11     1      455            500       -5.      641            651
     4  2013    11     1      539            545       -6.      856            827
     5  2013    11     1      542            545       -3.      831            855
     6  2013    11     1      549            600      -11.      912            923
     7  2013    11     1      550            600      -10.      705            659
     8  2013    11     1      554            600       -6.      659            701
     9  2013    11     1      554            600       -6.      826            827
    10  2013    11     1      554            600       -6.      749            751
    # ... with 55,393 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>
    > (nov_dec <- filter(flights,month %in% c(11,12)))#这个是选择month等于11和12的列 # A tibble: 55,403 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 11 1 5 2359 6. 352 345 2 2013 11 1 35 2250 105. 123 2356 3 2013 11 1 455 500 -5. 641 651 4 2013 11 1 539 545 -6. 856 827 5 2013 11 1 542 545 -3. 831 855 6 2013 11 1 549 600 -11. 912 923 7 2013 11 1 550 600 -10. 705 659 8 2013 11 1 554 600 -6. 659 701 9 2013 11 1 554 600 -6. 826 827 10 2013 11 1 554 600 -6. 749 751 # ... with 55,393 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>
    > filter(flights,arr_delay <= 120,dep_delay <= 120)#这个可以选择arr_delay小于等于120且dep_delay小于等于120的列 # A tibble: 316,050 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 7 2013 1 1 555 600 -5. 913 854 8 2013 1 1 557 600 -3. 709 723 9 2013 1 1 557 600 -3. 838 846 10 2013 1 1 558 600 -2. 753 745 # ... with 316,040 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>

      那么遇到了缺失值怎么办,怎么办,怎么办,,,,,,,

    我来告诉你,那就是filter()会忽略所有缺失值,你可以看下面这个例子,仔细琢磨一下你就可以发现这个奥秘

    > (df <- tibble(x = c(1,NA,3)))#不要惊慌,这个也就相当于构成一个data.frame()数据集,哎呀,差不多。不要怕
    # A tibble: 3 x 1
          x
      <dbl>
    1    1.
    2   NA 
    3    3.
    
    > filter(df,x > 1)
    # A tibble: 1 x 1
          x
      <dbl>
    1    3.
    
    > filter(df,is.na(x) | x > 1)#看我,看这里,有没有发现加上一个is.na(x)就出现缺失值了。厉害吧
    # A tibble: 2 x 1
          x
      <dbl>
    1   NA 
    2    3.
    

      

    今天就先写这么多了,我女朋友找我了,溜了

  • 相关阅读:
    设计模式:组合模式
    对技术的认识及思考
    设计模式:策略模式
    java集合:常用集合的数据结构
    设计模式:代理模式
    java反射
    Spring事务管理
    在Spring使用junit注解进行单元测试
    tomcat限制ip访问
    获取openid回调两次
  • 原文地址:https://www.cnblogs.com/yuanzhoulvpi/p/8799051.html
Copyright © 2020-2023  润新知