При раду са великим базама података могу се јавити компликованији захтеви, код којих је потребна претходна траснформација података. Један од елегантнијих приступа у таквим случајевима је употреба пакета dplyr
.
Неке од основних функција на којима је заснован пакет 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.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
пакета и то су:
NA
вредност;Погледајмо како ова функција ради на примеру база 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.