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

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.

Učitavanje eksternih podataka

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čitavanje podataka pomoću RSTUDIO GUI komandi

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)
Humor_styles dataset
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