Ovde ćemo se upoznati sa osnovnim metodama rada sa podacima, prvenstveno kroz paket dplyr
, koji je jedan od najkorišćenijih paketa u R-u. Pre upoznavanja sa tim paketom, osnvrnućemo se na osnovnu strukturu podataka u R-u, dataframe, koja se koristi za rad sa tabelarnim podacima.
Dataframe je najčešći način čuvanja podataka u R-u i vrlo je pogodan za rad i analizu. Služi za prikaz tabelarnih podataka, pa liči na matricu, s tim što je dataframe u snovi lista koja sadrži vektore jednakih dužina (kolone), pri čemu ti vektori ne moraju biti istog tipa. Dakle možemo imati jednu kolonu koju čine brojevi, a drugu tekstualni podaci.
Dataframe se pravi na sledeći način:
df <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("prvi", "drugi", "treci"))
df
kolona1 kolona2
1 1 prvi
2 2 drugi
3 3 treci
Ovako smo dobili dataframe sa dve kolone, od kojih je jedna numerička a druga tekstualna.
str(df)
'data.frame': 3 obs. of 2 variables:
$ kolona1: num 1 2 3
$ kolona2: Factor w/ 3 levels "drugi","prvi",..: 2 1 3
R podrazumevano pretvara tekstualne podatke u faktore, to možemo preduprediti ako dodamo argument stringsAsFactors = FALSE
.
df <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("prvi", "drugi", "treci"), stringsAsFactors = FALSE)
str(df)
'data.frame': 3 obs. of 2 variables:
$ kolona1: num 1 2 3
$ kolona2: chr "prvi" "drugi" "treci"
df
kolona1 kolona2
1 1 prvi
2 2 drugi
3 3 treci
Dva dataframe-a (koji imaju isi broj kolona) se mogu spojiti da dobijemo više kolona korišćenjem funkcije cbind
.
df1 <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("prvi", "drugi", "treci"), stringsAsFactors = FALSE)
df2 <- data.frame(kolona3 = c(4,5,6), kolona4 = c("prvi1", "drugi1", "treci1"), stringsAsFactors = FALSE)
df3 <- cbind(df1, df2)
df3
kolona1 kolona2 kolona3 kolona4
1 1 prvi 4 prvi1
2 2 drugi 5 drugi1
3 3 treci 6 treci1
Takodje, mogu se nadovezati po vrstama (ako imaju ista imena kolona) funkcijom rbind
.
df1 <- data.frame(kolona1 = c(1, 2, 3), kolona2 = c("prvi", "drugi", "treci"), stringsAsFactors = FALSE)
df2 <- data.frame(kolona1 = c(4,5,6), kolona2 = c("prvi1", "drugi1", "treci1"), stringsAsFactors = FALSE)
df4 <- rbind(df1, df2)
df4
kolona1 kolona2
1 1 prvi
2 2 drugi
3 3 treci
4 4 prvi1
5 5 drugi1
6 6 treci1
Vrednostima kolona možemo pristupati pomoću operatora $
, kao u listama, a istim možemo i dodati nove kolone.
df$kolona1
[1] 1 2 3
df$kolona5 <- c(7,8,9)
df
kolona1 kolona2 kolona5
1 1 prvi 7
2 2 drugi 8
3 3 treci 9
Medjutim, možda elegantniji način filtriranja i odabira podskupova dataframe-a je korišćenjem uglatih zagrada. Koristimo notaciju df[redovi, kolone]
, gde prvim argumentom odredjujemo koje redove želimo da uzmemo, a drugim koje kolone. Prazno mesto za neki od argumenata znači “uzmi sve”.
df[,] # sve
kolona1 kolona2 kolona5
1 1 prvi 7
2 2 drugi 8
3 3 treci 9
df[1,] # prva vrsta
kolona1 kolona2 kolona5
1 1 prvi 7
df[,1] # prva kolona
[1] 1 2 3
Redovi mogu biti ili vektori brojeva koji označavaju indekse redova koje da uzmemo, ili vektori TRUE/FALSE vrednosti iste dužine kao broj vrsta u dataframe-u, pri čemu se tada biraju redovi na pozicijama gde je u vektoru vrednost TRUE.
df4[c(1,3,4), ] # sve kolone, redovi 1,3,4
kolona1 kolona2
1 1 prvi
3 3 treci
4 4 prvi1
df4[df4$kolona1 > 3, ] # sve kolone, one vrste kod kojih je kolona1 veca od 3
kolona1 kolona2
4 4 prvi1
5 5 drugi1
6 6 treci1
Kolone mogu biti ili vektori brojeva koji označavaju koje kolone da uzmemo prema indeksu, ili vektori stringova, koji označavaju imena kolona koje da uzmemo.
df3[, c(1,3)] # sve vrste, 1 i 3 kolona
kolona1 kolona3
1 1 4
2 2 5
3 3 6
df3[, c("kolona1", "kolona3")] # isto
kolona1 kolona3
1 1 4
2 2 5
3 3 6
df3[c(1,3), c("kolona1", "kolona3")] # prvi i treci red, prva i treca kolona
kolona1 kolona3
1 1 4
3 3 6
Korisna stvar je da ako koristimo vektore brojeva za indeksiranje, ukoliko stavimo znak -
ispred, to znači da izuzimamo te redove/kolone.
df[, -1] # sve bez prve kolone
kolona2 kolona5
1 prvi 7
2 drugi 8
3 treci 9
df[-2, ] # sve bez druge vrste
kolona1 kolona2 kolona5
1 1 prvi 7
3 3 treci 9
df[-c(1,2), c("kolona2", "kolona5")] # druga i peta kolona, bez prve i druge vrste
kolona2 kolona5
3 treci 9
Konačno, za osnovne informacije o tabeli postoje funkcije colnames
, rownames
, ncol
i nrow
, za koje možete pretpostaviti šta rade.
Prikažimo mogućnosti paketa dplyr
kroz istraživanje podataka o životnom veku u državama, poteklih od Svetske zdravstvene organizacije. Podaci koje ćemo posmatrati su dostupni na https://www.kaggle.com/kumarajarshi/life-expectancy-who.
Kada preuzmemo podatke, učitavamo ih funkcijom read.csv
:
library(tidyverse)
who_data <- read.csv(here::here("data_raw","Life Expectancy Data.csv"))
who_data %>% sample_n(15) # stampamo 15 slucajno izabranih
Country Year Status Life.expectancy
1 Bangladesh 2013 Developing 71.0
2 Turkmenistan 2011 Developing 65.6
3 Kiribati 2004 Developing 64.8
4 Samoa 2008 Developing 72.5
5 Dominican Republic 2011 Developing 73.1
6 Finland 2005 Developing 78.9
7 Bolivia (Plurinational State of) 2010 Developing 68.7
8 Malaysia 2000 Developing 72.4
9 Greece 2003 Developing 79.1
10 Venezuela (Bolivarian Republic of) 2002 Developing 73.1
11 Papua New Guinea 2003 Developing 59.6
12 Turkey 2004 Developing 72.0
13 Dominican Republic 2008 Developing 73.3
14 Spain 2013 Developed 82.4
15 Cuba 2010 Developing 78.0
Adult.Mortality infant.deaths Alcohol percentage.expenditure Hepatitis.B
1 135 104 0.01 52.829865 96
2 217 7 2.55 490.418133 97
3 214 0 0.48 10.624274 67
4 146 0 3.97 47.352605 12
5 16 6 5.91 843.787700 8
6 11 0 9.95 4816.589613 NA
7 22 9 3.95 0.000000 91
8 149 4 0.54 23.371672 97
9 81 0 9.46 2124.921517 92
10 167 10 6.89 0.000000 6
11 321 11 0.59 124.378936 67
12 132 33 1.35 1.132767 77
13 161 6 6.12 49.092420 81
14 6 1 9.25 423.680459 95
15 98 1 4.13 787.280816 96
Measles BMI under.five.deaths Polio Total.expenditure Diphtheria HIV.AIDS
1 237 17.0 130 96 2.88 96 0.1
2 0 45.0 8 97 1.98 97 0.1
3 0 71.4 0 61 1.39 62 0.1
4 0 71.4 0 54 4.52 26 0.1
5 2 54.7 7 84 4.22 84 0.7
6 1 58.1 0 97 8.43 97 0.1
7 0 49.3 12 9 5.44 91 0.2
8 6187 26.0 5 98 3.40 98 0.1
9 0 59.2 1 93 8.61 94 0.1
10 2392 54.7 12 81 4.93 65 0.1
11 3863 39.6 14 62 6.79 68 1.4
12 8927 56.8 39 85 5.37 85 0.1
13 0 51.5 8 86 4.20 82 1.4
14 131 65.4 2 96 9.10 96 0.1
15 0 57.7 1 99 1.19 96 0.1
GDP Population thinness..1.19.years thinness.5.9.years
1 951.88945 157571292 18.3 18.8
2 5649.97849 517461 3.2 3.3
3 113.62860 9542 0.2 0.2
4 359.82223 183526 0.2 0.2
5 5759.64300 12795 3.3 3.2
6 38969.17163 524696 0.9 0.8
7 NA NA 1.2 1.1
8 445.17471 2318568 9.8 9.6
9 18477.57841 19287 0.8 0.8
10 NA NA 1.7 1.7
11 588.35826 61724 1.5 1.4
12 64.72953 677855 5.1 4.9
13 511.37937 963652 3.4 3.3
14 2921.93420 466245 0.6 0.5
15 5676.14143 NA 3.4 3.2
Income.composition.of.resources Schooling
1 0.565 10.0
2 0.665 10.6
3 0.000 12.4
4 0.688 12.9
5 0.703 13.0
6 0.864 17.1
7 0.643 13.8
8 0.715 11.6
9 0.823 15.2
10 0.684 11.0
11 0.433 7.2
12 0.675 12.0
13 0.692 12.8
14 0.874 17.5
15 0.784 17.6
Paket dplyr
koristi malo bogatiju strukturu umesto dataframe-a za tabelarne podatke, a to je tibble. Podatke pretvaramo u taj format na sledeći način:
who_data <- as_tibble(who_data)
who_data
# A tibble: 2,938 x 22
Country Year Status Life.expectancy Adult.Mortality infant.deaths Alcohol
<fct> <int> <fct> <dbl> <int> <int> <dbl>
1 Afghan… 2015 Devel… 65 263 62 0.01
2 Afghan… 2014 Devel… 59.9 271 64 0.01
3 Afghan… 2013 Devel… 59.9 268 66 0.01
4 Afghan… 2012 Devel… 59.5 272 69 0.01
5 Afghan… 2011 Devel… 59.2 275 71 0.01
6 Afghan… 2010 Devel… 58.8 279 74 0.01
7 Afghan… 2009 Devel… 58.6 281 77 0.01
8 Afghan… 2008 Devel… 58.1 287 80 0.03
9 Afghan… 2007 Devel… 57.5 295 82 0.02
10 Afghan… 2006 Devel… 57.3 295 84 0.03
# … with 2,928 more rows, and 15 more variables: percentage.expenditure <dbl>,
# Hepatitis.B <int>, Measles <int>, BMI <dbl>, under.five.deaths <int>,
# Polio <int>, Total.expenditure <dbl>, Diphtheria <int>, HIV.AIDS <dbl>,
# GDP <dbl>, Population <dbl>, thinness..1.19.years <dbl>,
# thinness.5.9.years <dbl>, Income.composition.of.resources <dbl>,
# Schooling <dbl>
Vidimo blage razlike u prikazu.
Korisno je pogledati podatke funkcijom glimpse
(iz dplyr
), gde vidimo tip promenljivih i prvih nekoliko podataka iz odgovarajuće kolone.
glimpse(who_data)
Observations: 2,938
Variables: 22
$ Country <fct> Afghanistan, Afghanistan, Afghanistan…
$ Year <int> 2015, 2014, 2013, 2012, 2011, 2010, 2…
$ Status <fct> Developing, Developing, Developing, D…
$ Life.expectancy <dbl> 65.0, 59.9, 59.9, 59.5, 59.2, 58.8, 5…
$ Adult.Mortality <int> 263, 271, 268, 272, 275, 279, 281, 28…
$ infant.deaths <int> 62, 64, 66, 69, 71, 74, 77, 80, 82, 8…
$ Alcohol <dbl> 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0…
$ percentage.expenditure <dbl> 71.279624, 73.523582, 73.219243, 78.1…
$ Hepatitis.B <int> 65, 62, 64, 67, 68, 66, 63, 64, 63, 6…
$ Measles <int> 1154, 492, 430, 2787, 3013, 1989, 286…
$ BMI <dbl> 19.1, 18.6, 18.1, 17.6, 17.2, 16.7, 1…
$ under.five.deaths <int> 83, 86, 89, 93, 97, 102, 106, 110, 11…
$ Polio <int> 6, 58, 62, 67, 68, 66, 63, 64, 63, 58…
$ Total.expenditure <dbl> 8.16, 8.18, 8.13, 8.52, 7.87, 9.20, 9…
$ Diphtheria <int> 65, 62, 64, 67, 68, 66, 63, 64, 63, 5…
$ HIV.AIDS <dbl> 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.…
$ GDP <dbl> 584.25921, 612.69651, 631.74498, 669.…
$ Population <dbl> 33736494, 327582, 31731688, 3696958, …
$ thinness..1.19.years <dbl> 17.2, 17.5, 17.7, 17.9, 18.2, 18.4, 1…
$ thinness.5.9.years <dbl> 17.3, 17.5, 17.7, 18.0, 18.2, 18.4, 1…
$ Income.composition.of.resources <dbl> 0.479, 0.476, 0.470, 0.463, 0.454, 0.…
$ Schooling <dbl> 10.1, 10.0, 9.9, 9.8, 9.5, 9.2, 8.9, …
Sumarne podatke po kolonama vidimo ugradjenom funkcijom summary
.
summary(who_data)
Country Year Status Life.expectancy
Afghanistan : 16 Min. :2000 Developed : 512 Min. :36.30
Albania : 16 1st Qu.:2004 Developing:2426 1st Qu.:63.10
Algeria : 16 Median :2008 Median :72.10
Angola : 16 Mean :2008 Mean :69.22
Antigua and Barbuda: 16 3rd Qu.:2012 3rd Qu.:75.70
Argentina : 16 Max. :2015 Max. :89.00
(Other) :2842 NA's :10
Adult.Mortality infant.deaths Alcohol percentage.expenditure
Min. : 1.0 Min. : 0.0 Min. : 0.0100 Min. : 0.000
1st Qu.: 74.0 1st Qu.: 0.0 1st Qu.: 0.8775 1st Qu.: 4.685
Median :144.0 Median : 3.0 Median : 3.7550 Median : 64.913
Mean :164.8 Mean : 30.3 Mean : 4.6029 Mean : 738.251
3rd Qu.:228.0 3rd Qu.: 22.0 3rd Qu.: 7.7025 3rd Qu.: 441.534
Max. :723.0 Max. :1800.0 Max. :17.8700 Max. :19479.912
NA's :10 NA's :194
Hepatitis.B Measles BMI under.five.deaths
Min. : 1.00 Min. : 0.0 Min. : 1.00 Min. : 0.00
1st Qu.:77.00 1st Qu.: 0.0 1st Qu.:19.30 1st Qu.: 0.00
Median :92.00 Median : 17.0 Median :43.50 Median : 4.00
Mean :80.94 Mean : 2419.6 Mean :38.32 Mean : 42.04
3rd Qu.:97.00 3rd Qu.: 360.2 3rd Qu.:56.20 3rd Qu.: 28.00
Max. :99.00 Max. :212183.0 Max. :87.30 Max. :2500.00
NA's :553 NA's :34
Polio Total.expenditure Diphtheria HIV.AIDS
Min. : 3.00 Min. : 0.370 Min. : 2.00 Min. : 0.100
1st Qu.:78.00 1st Qu.: 4.260 1st Qu.:78.00 1st Qu.: 0.100
Median :93.00 Median : 5.755 Median :93.00 Median : 0.100
Mean :82.55 Mean : 5.938 Mean :82.32 Mean : 1.742
3rd Qu.:97.00 3rd Qu.: 7.492 3rd Qu.:97.00 3rd Qu.: 0.800
Max. :99.00 Max. :17.600 Max. :99.00 Max. :50.600
NA's :19 NA's :226 NA's :19
GDP Population thinness..1.19.years
Min. : 1.68 Min. :3.400e+01 Min. : 0.10
1st Qu.: 463.94 1st Qu.:1.958e+05 1st Qu.: 1.60
Median : 1766.95 Median :1.387e+06 Median : 3.30
Mean : 7483.16 Mean :1.275e+07 Mean : 4.84
3rd Qu.: 5910.81 3rd Qu.:7.420e+06 3rd Qu.: 7.20
Max. :119172.74 Max. :1.294e+09 Max. :27.70
NA's :448 NA's :652 NA's :34
thinness.5.9.years Income.composition.of.resources Schooling
Min. : 0.10 Min. :0.0000 Min. : 0.00
1st Qu.: 1.50 1st Qu.:0.4930 1st Qu.:10.10
Median : 3.30 Median :0.6770 Median :12.30
Mean : 4.87 Mean :0.6276 Mean :11.99
3rd Qu.: 7.20 3rd Qu.:0.7790 3rd Qu.:14.30
Max. :28.60 Max. :0.9480 Max. :20.70
NA's :34 NA's :167 NA's :163
U donjem videu dat je primer učitavanja podataka iz fajla gde su kolone odvojene sa ; (tačkom- zapetom).
GUI ćemo koristiti za generisanje koda koji ćemo zatim prilagodini u skripti. GUI opcija “From Text (readr)” omogućava uvoz CSV i sličnih fajlova pomoću readr paketa. Podržava sledeće:
U skripti, umesto podrazumevanog načina definisanja putanje koristimo funkciju here iz istoimenog paketa.
here::here("data_raw","humor_dataset.csv")
Prilagođen kod:
library(tidyverse)
humor_dataset <- read_delim(here::here("data_raw","humor_dataset.csv"),
";", escape_double = FALSE, trim_ws = TRUE)
Q1 | Q2 | Q3 | Q4 | Q5 | Q6 | Q7 | Q8 | Q9 | Q10 | Q11 | Q12 | Q13 | Q14 | Q15 | Q16 | Q17 | Q18 | Q19 | Q20 | Q21 | Q22 | Q23 | Q24 | Q25 | Q26 | Q27 | Q28 | Q29 | Q30 | Q31 | Q32 | affiliative | selfenhancing | agressive | selfdefeating | age | gender | accuracy |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | 2 | 3 | 1 | 4 | 5 | 4 | 3 | 4 | 3 | 3 | 1 | 5 | 4 | 4 | 4 | 2 | 3 | 3 | 1 | 4 | 4 | 3 | 2 | 1 | 3 | 2 | 4 | 2 | 4 | 2 | 2 | 4.0 | 3.5 | 3.0 | 2.3 | 25 | 2 | 100 |
2 | 3 | 2 | 2 | 4 | 4 | 4 | 3 | 4 | 3 | 4 | 3 | 3 | 4 | 5 | 4 | 2 | 2 | 3 | 2 | 3 | 3 | 4 | 2 | 2 | 5 | 1 | 2 | 4 | 4 | 3 | 1 | 3.3 | 3.5 | 3.3 | 2.4 | 44 | 2 | 90 |
3 | 4 | 3 | 3 | 4 | 4 | 3 | 1 | 2 | 4 | 3 | 2 | 4 | 4 | 3 | 3 | 2 | 4 | 2 | 1 | 4 | 2 | 4 | 3 | 2 | 4 | 3 | 3 | 2 | 5 | 4 | 2 | 3.9 | 3.9 | 3.1 | 2.3 | 50 | 1 | 75 |
3 | 3 | 3 | 4 | 3 | 5 | 4 | 3 | -1 | 4 | 2 | 4 | 4 | 5 | 4 | 3 | 3 | 3 | 3 | 3 | 4 | 3 | 2 | 4 | 2 | 4 | 2 | 2 | 4 | 5 | 3 | 3 | 3.6 | 4.0 | 2.9 | 3.3 | 30 | 2 | 85 |
1 | 4 | 2 | 2 | 3 | 5 | 4 | 1 | 4 | 4 | 2 | 2 | 5 | 4 | 4 | 4 | 2 | 3 | 2 | 1 | 5 | 3 | 3 | 1 | 1 | 5 | 2 | 3 | 2 | 5 | 4 | 2 | 4.1 | 4.1 | 2.9 | 2.0 | 52 | 1 | 80 |
3 | 3 | 3 | 2 | 3 | 3 | 4 | 2 | 2 | 1 | 3 | 3 | 4 | 4 | 4 | 3 | 2 | 1 | 4 | 2 | 4 | 4 | 4 | 2 | 2 | 3 | 2 | 4 | 3 | 4 | 3 | 3 | 3.6 | 2.9 | 3.4 | 2.6 | 30 | 2 | 60 |
4 | 1 | 2 | 4 | 2 | 3 | 3 | 3 | 4 | 4 | 4 | 1 | 2 | 1 | 2 | 4 | 4 | 1 | 3 | 1 | 3 | 2 | 2 | 3 | 4 | 3 | 2 | 2 | 3 | 3 | 4 | 4 | 2.3 | 2.3 | 2.8 | 2.8 | 27 | 1 | 60 |
2 | 4 | 4 | 1 | 5 | 5 | 4 | 3 | 2 | 4 | 3 | 3 | 5 | 4 | 3 | 3 | 3 | 4 | 5 | 3 | 4 | 3 | 3 | 1 | 1 | 4 | 2 | 4 | 1 | 5 | 2 | 2 | 4.4 | 4.1 | 3.3 | 2.5 | 34 | 1 | 88 |
2 | 2 | 1 | 1 | 3 | 4 | 3 | 1 | 3 | 3 | 2 | 2 | 5 | 3 | 3 | 4 | 2 | 2 | 4 | 1 | 4 | 4 | 4 | 2 | 1 | 3 | 4 | 4 | 1 | 5 | 2 | 1 | 4.1 | 3.3 | 2.9 | 2.0 | 30 | 2 | 95 |
4 | 2 | 4 | 1 | 3 | 5 | 4 | 2 | 3 | 1 | 5 | 3 | 1 | 3 | 1 | 5 | 5 | 1 | 3 | 1 | 2 | 1 | 5 | 2 | 4 | 5 | 5 | 2 | 1 | 5 | 3 | 2 | 2.4 | 2.9 | 3.8 | 2.3 | 18 | 1 | 85 |