Dataframe и пакет dplyr


Dataframe је најчешћи начин чувања података у R-у. Служи за чување табеларних података, али у основи представља листу и садржи векторе једнаких дужина, који не морају бити истог типа.

Наводимо пример dataframe-a од код кога је једна колона нумеричка, а друга текстуална.

df <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("a", "b", "c"))
df
##   kolona1 kolona2
## 1       1       a
## 2       2       b
## 3       3       c
str(df)
## 'data.frame':    3 obs. of  2 variables:
##  $ kolona1: num  1 2 3
##  $ kolona2: chr  "a" "b" "c"

Два dataframe-а, са истим бројем врста се могу надовезати по колонама коришћењем функције cbind().

df1 <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("a", "b", "c"), stringsAsFactors = FALSE)
df2 <- data.frame(kolona3 = c(4,5,6), kolona4 = c("d", "e", "f"), stringsAsFactors = FALSE)
df3 <- cbind(df1, df2)
df3
##   kolona1 kolona2 kolona3 kolona4
## 1       1       a       4       d
## 2       2       b       5       e
## 3       3       c       6       f

Слично, уколико имају иста имена колона, могу се спојити коришћењем функције rbind().

df1 <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("a", "b", "c"), stringsAsFactors = FALSE)
df2 <- data.frame(kolona1 = c(4,5,6), kolona2 = c("d", "e", "f"), stringsAsFactors = FALSE)
df4 <- rbind(df1, df2)
df4
##   kolona1 kolona2
## 1       1       a
## 2       2       b
## 3       3       c
## 4       4       d
## 5       5       e
## 6       6       f

Елементима dataframe-а се може приступати помоћу оператора $.

df$kolona1
## [1] 1 2 3

Други приступ елементима је коришћење угластих заграда df[врста, колона], где први аргумент одређује које редове желимо да издвојимо, а други које колоне издвајамо.

На пример, желимо да издвојимо први елемент друге колоне…

df[1,2]
## [1] "a"

… или целу прву врсту…

df[1,]
##   kolona1 kolona2
## 1       1       a

… или целу другу колону…

df[,2]
## [1] "a" "b" "c"

… или прву и трећу врсту, а све колоне.

df[c(1,3), ]
##   kolona1 kolona2
## 1       1       a
## 3       3       c

Можемо да издвојимо све колоне, а оне врсте код којих је вредност у првој колони већа од два.

df4[df4$kolona1 > 2, ]
##   kolona1 kolona2
## 3       3       c
## 4       4       d
## 5       5       e
## 6       6       f

Колонама можемо да приступимо и прослеђивањем њихових назива.

df3[, c("kolona1", "kolona3")]
##   kolona1 kolona3
## 1       1       4
## 2       2       5
## 3       3       6

Уколико желимо да изоставимо неке редове или колоне, испред индекса треба да ставимо знак -.

На пример, ако желимо да буде приказано све сем прве колоне…

df3[, -1]
##   kolona2 kolona3 kolona4
## 1       a       4       d
## 2       b       5       e
## 3       c       6       f

… или све без прве врсте…

df3[-1,]
##   kolona1 kolona2 kolona3 kolona4
## 2       2       b       5       e
## 3       3       c       6       f

или прва и четврта колона, без друге врсте.

df3[-2,c("kolona1", "kolona4")]
##   kolona1 kolona4
## 1       1       d
## 3       3       f


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


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

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

  • select() - одабир колона;
  • arrange() - сортирање врста на основу неких колона;
  • filter() - одабир врста на основу неких услова;
  • mutate() - креирање нових колона од постојећих;
  • summarise() - одређивање неких сумарних статистика.

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

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

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

data <- data.frame(kolona1=c(1,2,3), kolona2=c("a","b","c"))
#install.packages("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. FTM
## 1     Gerald Wallace           32  286   35  14   34 41.2    1    3 33.3   6
## 2        Ian Mahinmi           61 1146  265 117  212 55.2    0    0  0.0  31
## 3          Pau Gasol           78 2681 1446 570 1153 49.4   12   26 46.2 294
## 4       Jusuf Nurkic           62 1103  426 171  383 44.6    0    2  0.0  84
## 5    Bismack Biyombo           64 1243  304 101  186 54.3    0    0  0.0 102
## 6        Jordan Hill           70 1874  841 357  777 45.9    3   11 27.3 124
## 7       Tyreke Evans           79 2690 1313 521 1165 44.7   69  227 30.4 202
## 8      Andre Dawkins            4   22    3   1    6 16.7    1    6 16.7   0
## 9       Robert Sacre           67 1133  307 126  306 41.2    0    1  0.0  55
## 10        Mike Scott           68 1123  529 201  453 44.4   66  192 34.4  61
## 11        Josh Smith           83 2301 1027 414  987 41.9   72  228 31.6 127
## 12 Marreese Speights           76 1207  791 318  646 49.2    5   18 27.8 150
## 13  Lance Stephenson           61 1573  501 207  550 37.6   18  105 17.1  69
## 14  Anthony Tolliver           76 1433  482 161  393 41.0  106  290 36.6  54
## 15     Anthony Davis           68 2455 1656 642 1199 53.5    1   12  8.3 371
## 16   Greivis Vasquez           82 1991  775 296  725 40.8  133  351 37.9  50
## 17      Ben McLemore           82 2670  996 363  831 43.7  140  391 35.8 130
## 18      Shane Larkin           76 1865  470 187  432 43.3   35  116 30.2  61
## 19    David Stockton            3   33    8   2    6 33.3    1    2 50.0   3
## 20      Damjan Rudez           68 1047  323 119  263 45.2   69  170 40.6  16
##    FTA  FT. OREB DREB REB AST STL BLK TOV  PF  EFF AST.TOV STL.TOV Age
## 1   15 40.0   17   40  57  11  15   4  18  19   75    0.61    0.83  NA
## 2  102 30.4  105  251 356  33  30  46  59 172  505    0.56    0.51  29
## 3  366 80.3  220  699 919 210  25 147 158 147 1934    1.33    0.16  35
## 4  132 63.6  125  257 382  50  52  68  86 207  632    0.58    0.61  NA
## 5  175 58.3  159  248 407  16  18  99  52 140  634    0.31    0.35  23
## 6  168 73.8  174  382 556 103  34  52 106 164 1016    0.97    0.32  28
## 7  291 69.4   82  334 416 521 100  37 246 198 1408    2.12    0.41  26
## 8    0  0.0    0    2   2   1   0   0   1   3    0    1.00    0.00  24
## 9   82 67.1   89  144 233  55  28  43  36 121  423    1.53    0.78  NA
## 10  77 79.2   45  154 199  75  25   3  39  83  524    1.92    0.64  27
## 11 255 49.8  152  378 530 277  87 116 206 228 1130    1.35    0.42  NA
## 12 178 84.3  109  216 325  72  20  34  82 189  804    0.88    0.24  28
## 13 110 62.7   39  238 277 240  38   8 128 134  552    1.88    0.30  25
## 14  69 78.3   51  185 236  59  24  16  51 137  519    1.16    0.47  NA
## 15 461 80.5  173  523 696 149 100 200  95 141 2059    1.57    1.05  22
## 16  66 75.8   22  194 216 302  46  10 119 177  785    2.54    0.39  28
## 17 160 81.3   31  210 241 140  77  19 138 219  837    1.01    0.56  22
## 18  78 78.2   29  147 176 226  93   9  83 150  629    2.72    1.12  23
## 19   6 50.0    0    2   2   9   2   0   4   1   10    2.25    0.50  24
## 20  23 69.6    8   39  47  53  16   5  47  79  246    1.13    0.34  29
##    Birth_Place          Birthdate                  Collage Experience Height
## 1                                                                         NA
## 2           fr   November 5, 1986                                   6  207.5
## 3           es       July 6, 1980                                  13  210.0
## 4                                                                         NA
## 5           cd    August 28, 1992                                   3  202.5
## 6           us      July 27, 1987    University of Arizona          5  205.0
## 7           us September 19, 1989    University of Memphis          5  195.0
## 8           us September 19, 1991          Duke University          R  192.5
## 9                                                                         NA
## 10          us      July 16, 1988   University of Virginia          2  200.0
## 11                                                                        NA
## 12          us     August 4, 1987    University of Florida          6  205.0
## 13          us  September 5, 1990 University of Cincinnati          4  192.5
## 14                                                                        NA
## 15          us     March 11, 1993   University of Kentucky          2  205.0
## 16          ve   January 16, 1987   University of Maryland          4  195.0
## 17          us  February 11, 1993     University of Kansas          1  192.5
## 18          us    October 2, 1992      University of Miami          1  177.5
## 19          us      June 24, 1991       Gonzaga University          R  177.5
## 20          hr      June 17, 1986                                   R  205.0
##    Pos Team Weight      BMI
## 1               NA       NA
## 2    C  IND 112.50 26.12861
## 3   PF  CHI 112.50 25.51020
## 4               NA       NA
## 5    C  CHA 114.75 27.98354
## 6    C  LAL 105.75 25.16359
## 7   SG  NOH  99.00 26.03550
## 8   SG  MIA  96.75 26.10896
## 9               NA       NA
## 10  PF  ATL 106.65 26.66250
## 11              NA       NA
## 12   C  GSW 114.75 27.30518
## 13  SG  CHA 103.50 27.93051
## 14              NA       NA
## 15  PF  NOH 113.85 27.09102
## 16  PG  TOR  97.65 25.68047
## 17  SG  SAC  87.75 23.68022
## 18  PG  NYK  78.75 24.99504
## 19  PG  SAC  74.25 23.56675
## 20  SF  IND 102.60 24.41404

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

players_data <- as_tibble(players_data)
players_data
## # A tibble: 490 × 34
##    Name       Games.Played   MIN   PTS   FGM   FGA   FG.  X3PM  X3PA  X3P.   FTM
##    <chr>             <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <int>
##  1 AJ Price             26   324   133    51   137  37.2    15    57  26.3    16
##  2 Aaron Bro…           82  1885   954   344   817  42.1   121   313  38.7   145
##  3 Aaron Gor…           47   797   243    93   208  44.7    13    48  27.1    44
##  4 Adreian P…           32   740   213    91   220  41.4     1     9  11.1    30
##  5 Al Horford           76  2318  1156   519   965  53.8    11    36  30.6   107
##  6 Al Jeffer…           65  1992  1082   486  1010  48.1     2     5  40     108
##  7 Alan Ande…           74  1744   545   195   440  44.3    73   210  34.8    82
##  8 Alec Burks           27   899   374   121   300  40.3    26    68  38.2   106
##  9 Alex Kirk             5    14     4     1     4  25       0     0   0       2
## 10 Alex Len             69  1518   432   179   353  50.7     1     3  33.3    73
## # ℹ 480 more rows
## # ℹ 23 more variables: 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 <chr>,
## #   Birthdate <chr>, Collage <chr>, Experience <chr>, Height <dbl>, Pos <chr>,
## #   Team <chr>, Weight <dbl>, BMI <dbl>

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

summary(players_data)
##      Name            Games.Played        MIN              PTS        
##  Length:490         Min.   : 1.00   Min.   :   3.0   Min.   :   0.0  
##  Class :character   1st Qu.:33.00   1st Qu.: 492.2   1st Qu.: 145.2  
##  Mode  :character   Median :61.00   Median :1193.0   Median : 423.0  
##                     Mean   :53.01   Mean   :1214.7   Mean   : 502.1  
##                     3rd Qu.:74.00   3rd Qu.:1905.8   3rd Qu.: 774.0  
##                     Max.   :83.00   Max.   :2981.0   Max.   :2217.0  
##                                                                      
##       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           Collage         
##  Min.   :20.00   Length:490         Length:490         Length:490        
##  1st Qu.:24.00   Class :character   Class :character   Class :character  
##  Median :27.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :27.51                                                           
##  3rd Qu.:30.00                                                           
##  Max.   :39.00                                                           
##  NA's   :68                                                              
##   Experience            Height          Pos                Team          
##  Length:490         Min.   :172.5   Length:490         Length:490        
##  Class :character   1st Qu.:190.0   Class :character   Class :character  
##  Mode  :character   Median :197.5   Mode  :character   Mode  :character  
##                     Mean   :197.4                                        
##                     3rd Qu.:205.0                                        
##                     Max.   :222.5                                        
##                     NA's   :68                                           
##      Weight            BMI       
##  Min.   : 72.45   Min.   :20.41  
##  1st Qu.: 90.00   1st Qu.:24.29  
##  Median : 99.00   Median :25.42  
##  Mean   : 99.47   Mean   :25.43  
##  3rd Qu.:108.00   3rd Qu.:26.44  
##  Max.   :162.00   Max.   :32.72  
##  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 × 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  
## # ℹ 336,766 more rows

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

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

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

flights %>%
  filter(origin == "JFK")
## # A tibble: 111,279 × 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      542            540         2      923            850
##  2  2013     1     1      544            545        -1     1004           1022
##  3  2013     1     1      557            600        -3      838            846
##  4  2013     1     1      558            600        -2      849            851
##  5  2013     1     1      558            600        -2      853            856
##  6  2013     1     1      558            600        -2      924            917
##  7  2013     1     1      559            559         0      702            706
##  8  2013     1     1      606            610        -4      837            845
##  9  2013     1     1      611            600        11      945            931
## 10  2013     1     1      613            610         3      925            921
## # ℹ 111,269 more rows
## # ℹ 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>

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

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

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

flights %>%
  filter(day==1 & (month == 11 | month == 12))
## # A tibble: 1,973 × 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
## # ℹ 1,963 more rows
## # ℹ 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>

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

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

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

flights %>%
  arrange(air_time) %>%
  select(tailnum, air_time)
## # A tibble: 336,776 × 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
## # ℹ 336,766 more rows

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

flights %>%
  arrange(desc(air_time)) %>%
  select(tailnum, air_time)
## # A tibble: 336,776 × 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
## # ℹ 336,766 more rows

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

subflights <- flights %>% sample_n(15) 
subflights %>%
  arrange(desc(month), desc(day)) %>%
  select(tailnum, month, day)
## # A tibble: 15 × 3
##    tailnum month   day
##    <chr>   <int> <int>
##  1 N753EV     12    29
##  2 N3EUAA     12    29
##  3 N328JB     12     8
##  4 N489UA     12     4
##  5 N333NB     10    25
##  6 N534JB      9    21
##  7 N909EV      9    13
##  8 N35271      8    26
##  9 N503JB      8    24
## 10 N3FAAA      7    21
## 11 N3DAAA      4    18
## 12 N11539      4    15
## 13 N3GXAA      4    13
## 14 N13995      3    14
## 15 N528MQ      2    14

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

subflights <- flights %>% sample_n(15) 
subflights %>%
  arrange(year, desc(air_time)) %>%
  select(tailnum, year, air_time)
## # A tibble: 15 × 3
##    tailnum  year air_time
##    <chr>   <int>    <dbl>
##  1 N338AA   2013      358
##  2 N73299   2013      350
##  3 N3HBAA   2013      344
##  4 N512UA   2013      339
##  5 N528VA   2013      325
##  6 N505UA   2013      318
##  7 N303DQ   2013      167
##  8 N931DL   2013      143
##  9 N6EAMQ   2013      138
## 10 N517MQ   2013      107
## 11 N334NB   2013      101
## 12 N906XJ   2013       95
## 13 N8696C   2013       49
## 14 N624MQ   2013       40
## 15 N3KJAA   2013       39

\(\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 × 11
##    tailnum  year month   day dep_delay arr_delay distance air_time  gain hours
##    <chr>   <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
##  1 N14228   2013     1     1         2        11     1400      227    -9 3.78 
##  2 N24211   2013     1     1         4        20     1416      227   -16 3.78 
##  3 N619AA   2013     1     1         2        33     1089      160   -31 2.67 
##  4 N804JB   2013     1     1        -1       -18     1576      183    17 3.05 
##  5 N668DN   2013     1     1        -6       -25      762      116    19 1.93 
##  6 N39463   2013     1     1        -4        12      719      150   -16 2.5  
##  7 N516JB   2013     1     1        -5        19     1065      158   -24 2.63 
##  8 N829AS   2013     1     1        -3       -14      229       53    11 0.883
##  9 N593JB   2013     1     1        -3        -8      944      140     5 2.33 
## 10 N3ALAA   2013     1     1        -2         8      733      138   -10 2.3  
## # ℹ 336,766 more rows
## # ℹ 1 more variable: gain_per_hour <dbl>

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

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

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

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

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

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

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

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

За одређивање укупног броја опсервација, користи се посебна функција 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 × 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.90      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))
## `summarise()` has grouped output by 'year', 'month'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 4
## # Groups:   year, month [12]
##     year month   day  delay
##    <int> <int> <int>  <dbl>
##  1  2013     1     1 12.7  
##  2  2013     1     2 12.7  
##  3  2013     1     3  5.73 
##  4  2013     1     4 -1.93 
##  5  2013     1     5 -1.53 
##  6  2013     1     6  4.24 
##  7  2013     1     7 -4.95 
##  8  2013     1     8 -3.23 
##  9  2013     1     9 -0.264
## 10  2013     1    10 -5.90 
## # ℹ 355 more rows

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

daily <- flights %>% 
             group_by(year, month, day) 
per_day<- daily %>% 
             summarise(flights = n())
## `summarise()` has grouped output by 'year', 'month'. You can override using the
## `.groups` argument.
per_day
## # A tibble: 365 × 4
## # Groups:   year, month [12]
##     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
## # ℹ 355 more rows

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

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

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

flights %>%
  group_by(origin, month) %>%
  summarise(count = n()) %>%
  top_n(5, count)
## `summarise()` has grouped output by 'origin'. You can override using the
## `.groups` argument.
## # A tibble: 15 × 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 пакета и то су:

  • inner_join - задржава оне редове за које у обе базе постоји вредност;
  • left_join - задржава све редове из прве базe, а тамо где нема одговарајуће вредности из друге базе стави NA вредност;
  • right_join - задржава све редове из друге наведене базе;
  • full_join - задржава све редове из обе базе.

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

airlines
## # A tibble: 16 × 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 × 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.  
## # ℹ 336,766 more rows

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