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.