При раду са великим базама података могу се јавити компликованији захтеви, код којих је потребна претходна траснформација података. Један од елегантнијих приступа у таквим случајевима је употреба пакета dplyr.


\(\color{lightseagreen}{\text{Основне функције}}\)

Неке од основних функција на којима је заснован пакет dplyr су:

Ове и још неке од функција из овог пакета ћемо детаљније обрадити у наставку.

У оквиру овог пакета, употребљава се синтакса заснована на оператору %>%. Овај оператор нам омогућава да излаз једне функције користимо као улазни аргумент друге, а заснован је на идеји читања с лева на десно, па тако код x %>% f(y) постаје f(x,y).

Наводимо пример избора колоне из базе помоћу оператора %>%.

data <- data.frame(kolona1=c(1,2,3), kolona2=c("a","b","c"))
#install.package("dplyr")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data %>% select(kolona1)
##   kolona1
## 1       1
## 2       2
## 3       3

Можемо и да нагласимо где се прослеђује лева страна оператора.

data %>% select(., kolona1)
##   kolona1
## 1       1
## 2       2
## 3       3

Еквивалентно, а без употребе оператора:

select(data, kolona1)
##   kolona1
## 1       1
## 2       2
## 3       3

\(\color{lightseagreen}{\text{Учитавање и приказ екстерних података}}\)

Користићемо базу која садржи податке о играчима који су играли у NBA лиги у сезони 2014/15. и који су доступни на линку: https://www.kaggle.com/drgilermo/nba-players-stats-20142015

Подаци се учитавају функцијом read.csv(). Из целе базе издвојићемо 20 случајно изабраних врста, односно играча.

players_data <- read.csv("players_stats.csv")
players_data %>% sample_n(20)
##                 Name Games.Played  MIN  PTS FGM FGA  FG. X3PM X3PA X3P.
## 187    Jabari Parker           25  738  308 129 263 49.0    4   16 25.0
## 274     Kevin Durant           27  913  686 238 467 51.0   64  159 40.3
## 287    Kyle Anderson           33  358   74  31  89 34.8    3   11 27.3
## 306     Lou Williams           80 2016 1242 375 928 40.4  152  447 34.0
## 380      PJ Hairston           45  687  254  87 269 32.3   49  163 30.1
## 251    Jordan Farmar           36  529  167  61 158 38.6   35   97 36.1
## 264      Kalin Lucas            1    6    0   0   1  0.0    0    0  0.0
## 170       Greg Smith           42  363   80  30  49 61.2    0    0  0.0
## 384 Quincy Pondexter           75 1793  538 188 447 42.1   91  244 37.3
## 451        TJ Warren           40  614  245 113 214 52.8    5   21 23.8
## 243     John Salmons           21  270   42  16  48 33.3    8   26 30.8
## 9          Alex Kirk            5   14    4   1   4 25.0    0    0  0.0
## 34     Arinze Onuaku            6   68   27  12  14 85.7    0    0  0.0
## 366      Omri Casspi           67 1416  593 209 427 48.9   35   87 40.2
## 31    Anthony Morrow           74 1806  790 285 615 46.3  141  325 43.4
## 405     Ronny Turiaf            2   19    0   0   0  0.0    0    0  0.0
## 404     Ronnie Price           43  982  221  77 223 34.5   31  109 28.4
## 206     Jarrett Jack           80 2241  957 359 817 43.9   39  146 26.7
## 44   Bismack Biyombo           64 1243  304 101 186 54.3    0    0  0.0
## 301  Leandro Barbosa           66  982  467 183 386 47.4   43  112 38.4
##     FTM FTA   FT. OREB DREB REB AST STL BLK TOV  PF EFF AST.TOV STL.TOV
## 187  46  66  69.7   50   88 138  42  31   5  47  42 323    0.89    0.66
## 274 146 171  85.4   16  162 178 110  24  25  74  40 695    1.49    0.32
## 287   9  14  64.3    5   67  72  28  15   7  10  28 123    2.80    1.50
## 306 340 395  86.1   24  127 151 164  88  10 101 103 946    1.62    0.87
## 380  31  36  86.1   22   70  92  21  21  13  22  61 192    0.96    0.96
## 251  10  11  90.9    8   34  42  67  20   5  32  52 171    2.09    0.63
## 264   0   0   0.0    0    0   0   0   1   0   0   1   0    0.00    0.00
## 170  20  39  51.3   26   53  79   9   7  11  11  53 137    0.82    0.64
## 384  71  96  74.0   53  142 195  94  19  24  51 150 535    1.84    0.37
## 451  14  19  73.7   41   44  85  25  18   9  27  51 249    0.93    0.67
## 243   2   4  50.0    4   17  21  13   9   4   5  25  50    2.60    1.80
## 9     2   2 100.0    1    0   1   1   0   0   0   1   3    0.00    0.00
## 34    3   8  37.5    7   14  21   4   1   3   2   6  47    2.00    0.50
## 366 140 191  73.3   54  206 260 102  31   9  88 107 638    1.16    0.35
## 31   79  89  88.8   40  155 195  60  54  11  38 135 732    1.58    1.42
## 405   0   0   0.0    0    1   1   2   0   0   0   0   3    0.00    0.00
## 404  36  45  80.0   19   50  69 165  67   4  52 118 319    3.17    1.29
## 206 200 227  88.1   19  226 245 373  75  13 191 143 987    1.95    0.39
## 44  102 175  58.3  159  248 407  16  18  99  52 140 634    0.31    0.35
## 301  58  74  78.4   23   68  91  99  41   8  44  87 443    2.25    0.93
##     Age Birth_Place          Birthdate
## 187  NA                               
## 274  27          us September 29, 1988
## 287  22          us September 20, 1993
## 306  29          us   October 27, 1986
## 380  23          us  December 24, 1992
## 251  29          us  November 30, 1986
## 264  26          us       May 24, 1989
## 170  24          us    January 8, 1991
## 384  27          us     March 10, 1988
## 451  NA                               
## 243  NA                               
## 9    24          us  November 14, 1991
## 34   28          us      July 13, 1987
## 366  27          il      June 22, 1988
## 31   30          us September 27, 1985
## 405  NA                               
## 404  32          us      June 21, 1983
## 206  32          us   October 28, 1983
## 44   23          cd    August 28, 1992
## 301  33          br  November 28, 1982
##                                   Collage Experience Height Pos Team
## 187                                                      NA         
## 274         University of Texas at Austin          7  202.5  SF  OKC
## 287 University of California, Los Angeles          R  202.5  SF  SAS
## 306                                                9  182.5  SG  TOR
## 380          University of North Carolina          R  195.0  SG  CHA
## 251 University of California, Los Angeles          7  185.0  PG  LAC
## 264             Michigan State University          R  182.5  PG  MEM
## 170   California State University, Fresno          3  205.0  PF  DAL
## 384              University of Washington          4  197.5  SF  NOH
## 451                                                      NA         
## 243                                                      NA         
## 9                University of New Mexico          R  210.0   C  CLE
## 34                    Syracuse University          1  202.5   C  MIN
## 366                                                5  202.5  SF  SAC
## 31        Georgia Institute of Technology          6  192.5  SG  OKC
## 405                                                      NA         
## 404             Utah Valley State College          9  185.0  PG  LAL
## 206       Georgia Institute of Technology          9  187.5  PG  NJN
## 44                                                 3  202.5   C  CHA
## 301                                               11  187.5  SG  GSW
##     Weight      BMI
## 187     NA       NA
## 274 108.00 26.33745
## 287 103.50 25.24005
## 306  78.75 23.64421
## 380 103.50 27.21893
## 251  81.00 23.66691
## 264  87.75 26.34641
## 170 112.50 26.76978
## 384  99.00 25.38055
## 451     NA       NA
## 243     NA       NA
## 9   110.25 25.00000
## 34  114.75 27.98354
## 366 101.25 24.69136
## 31   94.50 25.50177
## 405     NA       NA
## 404  85.50 24.98174
## 206  90.00 25.60000
## 44  114.75 27.98354
## 301  87.30 24.83200

У оквиру овог пакета користи се мало другачија структура за табеларне податке tibble, па ћемо податке претворити у тај формат и поново их приказати. Може се уочити мало прегледнији приказ.

players_data <- as_tibble(players_data)
players_data
## # A tibble: 490 x 34
##             Name Games.Played   MIN   PTS   FGM   FGA   FG.  X3PM  X3PA
##           <fctr>        <int> <int> <int> <int> <int> <dbl> <int> <int>
##  1      AJ Price           26   324   133    51   137  37.2    15    57
##  2  Aaron Brooks           82  1885   954   344   817  42.1   121   313
##  3  Aaron Gordon           47   797   243    93   208  44.7    13    48
##  4 Adreian Payne           32   740   213    91   220  41.4     1     9
##  5    Al Horford           76  2318  1156   519   965  53.8    11    36
##  6  Al Jefferson           65  1992  1082   486  1010  48.1     2     5
##  7 Alan Anderson           74  1744   545   195   440  44.3    73   210
##  8    Alec Burks           27   899   374   121   300  40.3    26    68
##  9     Alex Kirk            5    14     4     1     4  25.0     0     0
## 10      Alex Len           69  1518   432   179   353  50.7     1     3
## # ... with 480 more rows, and 25 more variables: X3P. <dbl>, FTM <int>,
## #   FTA <int>, FT. <dbl>, OREB <int>, DREB <int>, REB <int>, AST <int>,
## #   STL <int>, BLK <int>, TOV <int>, PF <int>, EFF <int>, AST.TOV <dbl>,
## #   STL.TOV <dbl>, Age <int>, Birth_Place <fctr>, Birthdate <fctr>,
## #   Collage <fctr>, Experience <fctr>, Height <dbl>, Pos <fctr>,
## #   Team <fctr>, Weight <dbl>, BMI <dbl>

Подаци се могу прегледати и помоћу функције glimpse().

glimpse(players_data)
## Observations: 490
## Variables: 34
## $ Name         <fctr> AJ Price, Aaron Brooks, Aaron Gordon, Adreian Pa...
## $ Games.Played <int> 26, 82, 47, 32, 76, 65, 74, 27, 5, 69, 42, 68, 74...
## $ MIN          <int> 324, 1885, 797, 740, 2318, 1992, 1744, 899, 14, 1...
## $ PTS          <int> 133, 954, 243, 213, 1156, 1082, 545, 374, 4, 432,...
## $ FGM          <int> 51, 344, 93, 91, 519, 486, 195, 121, 1, 179, 133,...
## $ FGA          <int> 137, 817, 208, 220, 965, 1010, 440, 300, 4, 353, ...
## $ FG.          <dbl> 37.2, 42.1, 44.7, 41.4, 53.8, 48.1, 44.3, 40.3, 2...
## $ X3PM         <int> 15, 121, 13, 1, 11, 2, 73, 26, 0, 1, 47, 0, 34, 3...
## $ X3PA         <int> 57, 313, 48, 9, 36, 5, 210, 68, 0, 3, 139, 0, 124...
## $ X3P.         <dbl> 26.3, 38.7, 27.1, 11.1, 30.6, 40.0, 34.8, 38.2, 0...
## $ FTM          <int> 16, 145, 44, 30, 107, 108, 82, 106, 2, 73, 121, 8...
## $ FTA          <int> 24, 174, 61, 46, 141, 165, 101, 129, 2, 104, 150,...
## $ FT.          <dbl> 66.7, 83.3, 72.1, 65.2, 75.9, 65.5, 81.2, 82.2, 1...
## $ OREB         <int> 6, 32, 46, 48, 131, 99, 31, 19, 1, 142, 23, 104, ...
## $ DREB         <int> 26, 134, 123, 114, 413, 449, 173, 95, 0, 312, 76,...
## $ REB          <int> 32, 166, 169, 162, 544, 548, 204, 114, 1, 454, 99...
## $ AST          <int> 46, 261, 33, 30, 244, 113, 83, 82, 1, 32, 106, 47...
## $ STL          <int> 7, 54, 21, 19, 68, 47, 56, 17, 0, 34, 30, 21, 70,...
## $ BLK          <int> 0, 15, 22, 9, 98, 84, 5, 5, 0, 105, 6, 51, 62, 15...
## $ TOV          <int> 14, 157, 38, 44, 100, 68, 60, 52, 0, 74, 48, 69, ...
## $ PF           <int> 15, 189, 83, 88, 121, 139, 148, 64, 1, 213, 48, 1...
## $ EFF          <int> 110, 791, 318, 244, 1530, 1225, 569, 338, 3, 778,...
## $ AST.TOV      <dbl> 3.29, 1.66, 0.87, 0.68, 2.44, 1.66, 1.38, 1.58, 0...
## $ STL.TOV      <dbl> 0.50, 0.34, 0.55, 0.43, 0.68, 0.69, 0.93, 0.33, 0...
## $ Age          <int> 29, 30, 20, 24, 29, 30, 33, 24, 24, 22, 27, 27, 2...
## $ Birth_Place  <fctr> us, us, us, us, do, us, us, us, us, ua, ru, fr, ...
## $ Birthdate    <fctr> October 7, 1986, January 14, 1985, September 16,...
## $ Collage      <fctr> University of Connecticut, University of Oregon,...
## $ Experience   <fctr> 5, 6, R, R, 7, 10, 5, 3, R, 1, 2, 4, 4, 1, 5, , ...
## $ Height       <dbl> 185.0, 180.0, 202.5, 205.0, 205.0, 205.0, 195.0, ...
## $ Pos          <fctr> PG, PG, PF, PF, C, C, SG, SG, C, C, SG, C, SF, S...
## $ Team         <fctr> PHO, CHI, ORL, ATL, ATL, CHA, NJN, UTA, CLE, PHO...
## $ Weight       <dbl> 81.45, 72.45, 99.00, 106.65, 110.25, 130.05, 99.0...
## $ BMI          <dbl> 23.79839, 22.36111, 24.14266, 25.37775, 26.23438,...

Сумарне статистике по колонома се добијају позивом функције summary().

summary(players_data)
##             Name      Games.Played        MIN              PTS        
##  Aaron Brooks :  1   Min.   : 1.00   Min.   :   3.0   Min.   :   0.0  
##  Aaron Gordon :  1   1st Qu.:33.00   1st Qu.: 492.2   1st Qu.: 145.2  
##  Adreian Payne:  1   Median :61.00   Median :1193.0   Median : 423.0  
##  AJ Price     :  1   Mean   :53.01   Mean   :1214.7   Mean   : 502.1  
##  Al Horford   :  1   3rd Qu.:74.00   3rd Qu.:1905.8   3rd Qu.: 774.0  
##  Al Jefferson :  1   Max.   :83.00   Max.   :2981.0   Max.   :2217.0  
##  (Other)      :484                                                    
##       FGM             FGA              FG.              X3PM       
##  Min.   :  0.0   Min.   :   0.0   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.: 55.5   1st Qu.: 139.0   1st Qu.: 39.60   1st Qu.:  1.00  
##  Median :156.0   Median : 357.5   Median : 42.90   Median : 18.00  
##  Mean   :188.3   Mean   : 419.5   Mean   : 43.10   Mean   : 39.39  
##  3rd Qu.:286.0   3rd Qu.: 642.8   3rd Qu.: 47.58   3rd Qu.: 66.00  
##  Max.   :659.0   Max.   :1471.0   Max.   :100.00   Max.   :286.00  
##                                                                    
##       X3PA            X3P.             FTM              FTA        
##  Min.   :  0.0   Min.   :  0.00   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.:  6.0   1st Qu.: 15.50   1st Qu.: 18.50   1st Qu.: 26.25  
##  Median : 58.0   Median : 31.30   Median : 58.00   Median : 80.00  
##  Mean   :112.5   Mean   : 25.52   Mean   : 86.04   Mean   :114.69  
##  3rd Qu.:192.0   3rd Qu.: 36.40   3rd Qu.:126.75   3rd Qu.:166.75  
##  Max.   :646.0   Max.   :100.00   Max.   :715.00   Max.   :824.00  
##                                                                    
##       FT.              OREB             DREB             REB         
##  Min.   :  0.00   Min.   :  0.00   Min.   :  0.00   Min.   :   0.00  
##  1st Qu.: 64.35   1st Qu.: 13.00   1st Qu.: 50.75   1st Qu.:  70.25  
##  Median : 75.00   Median : 31.50   Median :139.00   Median : 176.00  
##  Mean   : 70.45   Mean   : 54.66   Mean   :162.70   Mean   : 217.35  
##  3rd Qu.: 82.00   3rd Qu.: 75.75   3rd Qu.:228.75   3rd Qu.: 314.75  
##  Max.   :100.00   Max.   :437.00   Max.   :829.00   Max.   :1226.00  
##                                                                      
##       AST             STL              BLK              TOV        
##  Min.   :  0.0   Min.   :  0.00   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.: 24.0   1st Qu.: 12.25   1st Qu.:  5.00   1st Qu.: 23.00  
##  Median : 70.0   Median : 32.00   Median : 14.00   Median : 56.50  
##  Mean   :110.6   Mean   : 38.84   Mean   : 24.08   Mean   : 68.83  
##  3rd Qu.:150.8   3rd Qu.: 55.50   3rd Qu.: 29.75   3rd Qu.:100.00  
##  Max.   :838.0   Max.   :163.00   Max.   :200.00   Max.   :321.00  
##                                                                    
##        PF             EFF            AST.TOV         STL.TOV      
##  Min.   :  0.0   Min.   :  -3.0   Min.   :0.000   Min.   :0.0000  
##  1st Qu.: 45.5   1st Qu.: 165.0   1st Qu.:0.920   1st Qu.:0.3925  
##  Median :103.0   Median : 490.5   Median :1.345   Median :0.5300  
##  Mean   :101.5   Mean   : 564.3   Mean   :1.466   Mean   :0.6260  
##  3rd Qu.:148.8   3rd Qu.: 837.0   3rd Qu.:1.920   3rd Qu.:0.8200  
##  Max.   :285.0   Max.   :2202.0   Max.   :6.500   Max.   :3.0000  
##                                                                   
##       Age         Birth_Place             Birthdate  
##  Min.   :20.00   us     :330                   : 68  
##  1st Qu.:24.00          : 68   April 1, 1988   :  2  
##  Median :27.00   ca     :  9   April 19, 1991  :  2  
##  Mean   :27.51   au     :  7   February 7, 1989:  2  
##  3rd Qu.:30.00   fr     :  7   July 15, 1991   :  2  
##  Max.   :39.00   br     :  5   July 20, 1991   :  2  
##  NA's   :68      (Other): 64   (Other)         :412  
##                                   Collage      Experience      Height     
##                                       :140          : 68   Min.   :172.5  
##  Duke University                      : 18   R      : 68   1st Qu.:190.0  
##  University of California, Los Angeles: 15   1      : 56   Median :197.5  
##  University of Kentucky               : 15   2      : 46   Mean   :197.4  
##  University of North Carolina         : 15   5      : 35   3rd Qu.:205.0  
##  University of Kansas                 : 13   3      : 32   Max.   :222.5  
##  (Other)                              :274   (Other):185   NA's   :68     
##  Pos           Team         Weight            BMI       
##    : 68          : 68   Min.   : 72.45   Min.   :20.41  
##  C : 72   LAL    : 16   1st Qu.: 90.00   1st Qu.:24.29  
##  PF: 90   MIN    : 16   Median : 99.00   Median :25.42  
##  PG: 84   NOH    : 16   Mean   : 99.47   Mean   :25.43  
##  SF: 76   NYK    : 16   3rd Qu.:108.00   3rd Qu.:26.44  
##  SG:100   PHO    : 16   Max.   :162.00   Max.   :32.72  
##           (Other):342   NA's   :68       NA's   :68

У наставку ћемо проћи кроз, већ поменуте, основне функције пакета dplyr.


\(\color{lightseagreen}{\text{Функција select()}}\)

Функција select() служи за одабир колона из базе.

library(nycflights13)
flights %>%
  select(year, month, day, origin, dest)
## # A tibble: 336,776 x 5
##     year month   day origin  dest
##    <int> <int> <int>  <chr> <chr>
##  1  2013     1     1    EWR   IAH
##  2  2013     1     1    LGA   IAH
##  3  2013     1     1    JFK   MIA
##  4  2013     1     1    JFK   BQN
##  5  2013     1     1    LGA   ATL
##  6  2013     1     1    EWR   ORD
##  7  2013     1     1    EWR   FLL
##  8  2013     1     1    LGA   IAD
##  9  2013     1     1    JFK   MCO
## 10  2013     1     1    LGA   ORD
## # ... with 336,766 more rows

\(\color{lightseagreen}{\text{Функција filter()}}\)

Ова функција се користи за издвајање подскупова опсервација (врста) на основу неких услова.

Издвојићемо летове са аеродрома Џон Ф. Кенеди.

flights %>%
  filter(origin == "JFK")
## # A tibble: 111,279 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013     1     1      542            540         2      923
##  2  2013     1     1      544            545        -1     1004
##  3  2013     1     1      557            600        -3      838
##  4  2013     1     1      558            600        -2      849
##  5  2013     1     1      558            600        -2      853
##  6  2013     1     1      558            600        -2      924
##  7  2013     1     1      559            559         0      702
##  8  2013     1     1      606            610        -4      837
##  9  2013     1     1      611            600        11      945
## 10  2013     1     1      613            610         3      925
## # ... with 111,269 more rows, and 12 more variables: sched_arr_time <int>,
## #   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>

Функције у оквиру пакета dplyr не мењају оригиналну базу, па тако уколико желимо да имамо базу само са летовима са аеродрома Џон Ф. Кенеди, потребно је помоћу оператора доделе креирати нову базу.

jfk_flights <- flights %>%
  filter(origin == "JFK")

За више услова могу се користити оператори конјукције & и дисјункције |.

flights %>%
  filter(day==1 & (month == 11 | month == 12))
## # A tibble: 1,973 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1  2013    11     1        5           2359         6      352
##  2  2013    11     1       35           2250       105      123
##  3  2013    11     1      455            500        -5      641
##  4  2013    11     1      539            545        -6      856
##  5  2013    11     1      542            545        -3      831
##  6  2013    11     1      549            600       -11      912
##  7  2013    11     1      550            600       -10      705
##  8  2013    11     1      554            600        -6      659
##  9  2013    11     1      554            600        -6      826
## 10  2013    11     1      554            600        -6      749
## # ... with 1,963 more rows, and 12 more variables: sched_arr_time <int>,
## #   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>

\(\color{lightseagreen}{\text{Функција arrange()}}\)

Ова функција се користи за сортирање података у односу на једну или више колона.

Извршићемо сортирање по трајању лета у растућем поретку.

flights %>%
  arrange(air_time) %>%
  select(tailnum, air_time)
## # A tibble: 336,776 x 2
##    tailnum air_time
##      <chr>    <dbl>
##  1  N16911       20
##  2  N12167       20
##  3  N27200       21
##  4  N13913       21
##  5  N13955       21
##  6  N12921       21
##  7  N947UW       21
##  8  N8501F       21
##  9  N12160       21
## 10  N16987       21
## # ... with 336,766 more rows

За опадајући поредак користи се desc().

flights %>%
  arrange(desc(air_time)) %>%
  select(tailnum, air_time)
## # A tibble: 336,776 x 2
##    tailnum air_time
##      <chr>    <dbl>
##  1  N77066      695
##  2  N389HA      691
##  3  N388HA      686
##  4  N380HA      686
##  5  N384HA      683
##  6  N386HA      679
##  7  N59053      676
##  8  N380HA      676
##  9  N386HA      675
## 10  N76065      671
## # ... with 336,766 more rows

Уколико желимо да сортирање извршимо по више колона, потребно је да имена тих колона проследимо функцији arrange() и то тачно у оном редоследу по коме желимо да се врши сортирање. Тако се у наредном примеру сортирање врши прво опадајуће по месецу, па опадајуће по дану лета (ради прегледности приказа, сортирање ћемо извршити на случајно изабраном узорку од 15 опсервација).

subflights <- flights %>% sample_n(15) 
subflights %>%
  arrange(desc(month), desc(day)) %>%
  select(tailnum, month, day)
## # A tibble: 15 x 3
##    tailnum month   day
##      <chr> <int> <int>
##  1  N901XJ    12    28
##  2  N624AG    12    16
##  3  N508MQ    12     2
##  4  N409UA    10    28
##  5  N509JB     9    11
##  6   N3768     9     8
##  7  N14121     7    26
##  8  N655AW     6     5
##  9  N420US     5    26
## 10  N934WN     5    17
## 11  N18114     4    26
## 12  N27213     4    13
## 13  N11155     3    21
## 14  N14143     3    12
## 15  N3732J     2    14

Наводимо још један пример, где се сортирање врши прво растуће по години, па опадајуће по дужини трајања лета.

subflights <- flights %>% sample_n(15) 
subflights %>%
  arrange(year, desc(air_time)) %>%
  select(tailnum, year, air_time)
## # A tibble: 15 x 3
##    tailnum  year air_time
##      <chr> <int>    <dbl>
##  1  N327AA  2013      355
##  2  N849VA  2013      340
##  3  N530UA  2013      318
##  4  N536UA  2013      312
##  5  N547JB  2013      305
##  6  N14731  2013      231
##  7  N923DL  2013      158
##  8  N804JB  2013      155
##  9  N3DCAA  2013      138
## 10  N13995  2013      114
## 11  N169UW  2013       90
## 12  N812MQ  2013       72
## 13  N546MQ  2013       62
## 14  N834AY  2013       37
## 15  N730EV  2013       36

\(\color{lightseagreen}{\text{Функција mutate()}}\)

Функција mutate() се користи када бази треба додати колону која је функција постојећих. Ова функција нове колоне додаје на крај, као последње у бази, што можемо видети у наредном примеру.

flights_small <- flights %>% select(tailnum, year, month, day, ends_with("delay"), 
  distance, 
  air_time)

flights_small <- flights_small %>% mutate(
    gain = dep_delay - arr_delay,
    hours = air_time / 60,
    gain_per_hour = gain / hours
  )
flights_small
## # A tibble: 336,776 x 11
##    tailnum  year month   day dep_delay arr_delay distance air_time  gain
##      <chr> <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl>
##  1  N14228  2013     1     1         2        11     1400      227    -9
##  2  N24211  2013     1     1         4        20     1416      227   -16
##  3  N619AA  2013     1     1         2        33     1089      160   -31
##  4  N804JB  2013     1     1        -1       -18     1576      183    17
##  5  N668DN  2013     1     1        -6       -25      762      116    19
##  6  N39463  2013     1     1        -4        12      719      150   -16
##  7  N516JB  2013     1     1        -5        19     1065      158   -24
##  8  N829AS  2013     1     1        -3       -14      229       53    11
##  9  N593JB  2013     1     1        -3        -8      944      140     5
## 10  N3ALAA  2013     1     1        -2         8      733      138   -10
## # ... with 336,766 more rows, and 2 more variables: hours <dbl>,
## #   gain_per_hour <dbl>

За промену имена колоне, користи се функције rename().

flights_small %>% rename(trajanje_leta_u_satima = hours)
## # A tibble: 336,776 x 11
##    tailnum  year month   day dep_delay arr_delay distance air_time  gain
##      <chr> <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl>
##  1  N14228  2013     1     1         2        11     1400      227    -9
##  2  N24211  2013     1     1         4        20     1416      227   -16
##  3  N619AA  2013     1     1         2        33     1089      160   -31
##  4  N804JB  2013     1     1        -1       -18     1576      183    17
##  5  N668DN  2013     1     1        -6       -25      762      116    19
##  6  N39463  2013     1     1        -4        12      719      150   -16
##  7  N516JB  2013     1     1        -5        19     1065      158   -24
##  8  N829AS  2013     1     1        -3       -14      229       53    11
##  9  N593JB  2013     1     1        -3        -8      944      140     5
## 10  N3ALAA  2013     1     1        -2         8      733      138   -10
## # ... with 336,766 more rows, and 2 more variables:
## #   trajanje_leta_u_satima <dbl>, gain_per_hour <dbl>
flights_small
## # A tibble: 336,776 x 11
##    tailnum  year month   day dep_delay arr_delay distance air_time  gain
##      <chr> <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl>
##  1  N14228  2013     1     1         2        11     1400      227    -9
##  2  N24211  2013     1     1         4        20     1416      227   -16
##  3  N619AA  2013     1     1         2        33     1089      160   -31
##  4  N804JB  2013     1     1        -1       -18     1576      183    17
##  5  N668DN  2013     1     1        -6       -25      762      116    19
##  6  N39463  2013     1     1        -4        12      719      150   -16
##  7  N516JB  2013     1     1        -5        19     1065      158   -24
##  8  N829AS  2013     1     1        -3       -14      229       53    11
##  9  N593JB  2013     1     1        -3        -8      944      140     5
## 10  N3ALAA  2013     1     1        -2         8      733      138   -10
## # ... with 336,766 more rows, and 2 more variables: hours <dbl>,
## #   gain_per_hour <dbl>

\(\color{lightseagreen}{\text{Функција summarise()}}\)

Функција summarise() одређује сумарне вредности прослеђених колона.

У наредном примеру ћемо одредити просечно време кашњења лета при слетању на жељену дестинацију.

flights %>% summarise(mean(arr_delay))
## # A tibble: 1 x 1
##   `mean(arr_delay)`
##               <dbl>
## 1                NA

Видимо да постоје NA вредности, односно да за неке летове није дат податак о кашњењу, па додајемо na.rm = TRUE како бисмо игнорисали такве случајеве.

flights %>% summarise(mean(arr_delay, na.rm = TRUE))
## # A tibble: 1 x 1
##   `mean(arr_delay, na.rm = TRUE)`
##                             <dbl>
## 1                        6.895377

За одређивање укупног броја опсервација, користи се посебна функција n().

no_na_flights <- flights %>%
  filter(!is.na(arr_delay))

no_na_flights %>%
  summarise(
    count = n(),
    min_time = min(arr_delay),
    time_q1 = quantile(arr_delay, 0.25),
    median_time = median(arr_delay),
    mean_time = mean(arr_delay),
    time_q3 = quantile(arr_delay, 0.75),
    max_time = max(arr_delay)
  )
## # A tibble: 1 x 7
##    count min_time time_q1 median_time mean_time time_q3 max_time
##    <int>    <dbl>   <dbl>       <dbl>     <dbl>   <dbl>    <dbl>
## 1 327346      -86     -17          -5  6.895377      14     1272

Упоредите добијене резултате са резултатима добијеним позивом функције summary().

summary(no_na_flights$arr_delay)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  -86.000  -17.000   -5.000    6.895   14.000 1272.000

\(\color{lightseagreen}{\text{Функција group_by()}}\)

Ову функцију користимо уколико желимо да видимо својства по групама у оквиру одређене колоне.

На пример, желимо да одредимо просечно време кашњења по данима…

flights %>% 
  group_by(year, month, day) %>%
  summarise(delay = mean(arr_delay, na.rm = TRUE))
## # A tibble: 365 x 4
## # Groups:   year, month [?]
##     year month   day      delay
##    <int> <int> <int>      <dbl>
##  1  2013     1     1 12.6510229
##  2  2013     1     2 12.6928879
##  3  2013     1     3  5.7333333
##  4  2013     1     4 -1.9328194
##  5  2013     1     5 -1.5258020
##  6  2013     1     6  4.2364294
##  7  2013     1     7 -4.9473118
##  8  2013     1     8 -3.2275785
##  9  2013     1     9 -0.2642777
## 10  2013     1    10 -5.8988159
## # ... with 355 more rows

…или број летова по данима.

daily <- flights %>% 
             group_by(year, month, day) 
per_day<- daily %>% 
             summarise(flights = n())
per_day
## # A tibble: 365 x 4
## # Groups:   year, month [?]
##     year month   day flights
##    <int> <int> <int>   <int>
##  1  2013     1     1     842
##  2  2013     1     2     943
##  3  2013     1     3     914
##  4  2013     1     4     915
##  5  2013     1     5     720
##  6  2013     1     6     832
##  7  2013     1     7     933
##  8  2013     1     8     899
##  9  2013     1     9     902
## 10  2013     1    10     932
## # ... with 355 more rows

За дегруписање се користи функција ungroup().

daily %>% 
  ungroup() %>%         
  summarise(flights = n()) 
## # A tibble: 1 x 1
##   flights
##     <int>
## 1  336776

У наредном примеру ћемо издвојити пет месеци са највише летова за сваки полазни аеродром. Можемо приметити да је битан редослед груписања.

flights %>%
  group_by(origin, month) %>%
  summarise(count = n()) %>%
  top_n(5, count)
## # A tibble: 15 x 3
## # Groups:   origin [3]
##    origin month count
##     <chr> <int> <int>
##  1    EWR     3 10420
##  2    EWR     4 10531
##  3    EWR     5 10592
##  4    EWR     7 10475
##  5    EWR     8 10359
##  6    JFK     3  9697
##  7    JFK     5  9397
##  8    JFK     6  9472
##  9    JFK     7 10023
## 10    JFK     8  9983
## 11    LGA     7  8927
## 12    LGA     8  8985
## 13    LGA     9  9116
## 14    LGA    10  9642
## 15    LGA    12  9067

\(\color{lightseagreen}{\text{Функција join()}}\)

Функција join() се користи за спајање база по заједничкој колони.

Постоји више верзија ове функције у оквиру dplyr пакета и то су:

Погледајмо како ова функција ради на примеру база flights и airlines, које имају заједничку колону carrier. Можемо додати бази flights пуне називе авио компанија користећи податке из базе airlines.

airlines
## # A tibble: 16 x 2
##    carrier                        name
##      <chr>                       <chr>
##  1      9E           Endeavor Air Inc.
##  2      AA      American Airlines Inc.
##  3      AS        Alaska Airlines Inc.
##  4      B6             JetBlue Airways
##  5      DL        Delta Air Lines Inc.
##  6      EV    ExpressJet Airlines Inc.
##  7      F9      Frontier Airlines Inc.
##  8      FL AirTran Airways Corporation
##  9      HA      Hawaiian Airlines Inc.
## 10      MQ                   Envoy Air
## 11      OO       SkyWest Airlines Inc.
## 12      UA       United Air Lines Inc.
## 13      US             US Airways Inc.
## 14      VX              Virgin America
## 15      WN      Southwest Airlines Co.
## 16      YV          Mesa Airlines Inc.
full_airline <- flights %>%
  left_join(airlines, by = "carrier")
full_airline %>%
  select(tailnum, carrier, name)
## # A tibble: 336,776 x 3
##    tailnum carrier                     name
##      <chr>   <chr>                    <chr>
##  1  N14228      UA    United Air Lines Inc.
##  2  N24211      UA    United Air Lines Inc.
##  3  N619AA      AA   American Airlines Inc.
##  4  N804JB      B6          JetBlue Airways
##  5  N668DN      DL     Delta Air Lines Inc.
##  6  N39463      UA    United Air Lines Inc.
##  7  N516JB      B6          JetBlue Airways
##  8  N829AS      EV ExpressJet Airlines Inc.
##  9  N593JB      B6          JetBlue Airways
## 10  N3ALAA      AA   American Airlines Inc.
## # ... with 336,766 more rows

Илустрација join функција, преузета са https://r4ds.had.co.nz.