Sesija 01: Uvod u programski jezik R i RStudio IDE

Fidbek se upućuje na goran.milovanovic@datakolektiv.com. Ova sveščica prati kurs Uvod u R programiranje za analizu podataka 2020/21.


U našoj Sesiji 01 počinjemo da pravimo uvod u programski jezik R. Malo ćemo trčati pred rudu da naučimo neke stvari. Povućićemo razliku između base R i {tidyverse} pristupa R programiranju - oni se razlikuju ali zajedno rade fenomenalno! Diskutovaćemo neke osnovne stvari iz knjige R for Data Science i pokušati da procenimo koliko nam vremena treba za čitanje i savlađivanje materijala u njoj.

0. Tipovi podataka u R

Neki skupovi podataka dolaze sa programskim jezikom R, npr. čuveni iris:

data(iris)
head(iris, 10)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa

Funkcija head(): pokaži mi prvih n redova u data.frame! Isto, funkcija tail():

tail(iris, 10)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 141          6.7         3.1          5.6         2.4 virginica
## 142          6.9         3.1          5.1         2.3 virginica
## 143          5.8         2.7          5.1         1.9 virginica
## 144          6.8         3.2          5.9         2.3 virginica
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

daje poslednjih n redova data.frame.

my_vector <- c(1, 7, 9, 10, 14, 22, 3.14, 2.71, 99)
head(my_vector, 5)
## [1]  1  7  9 10 14
tail(my_vector, 5)
## [1] 14.00 22.00  3.14  2.71 99.00

Liste su veoma važne u R. Napravimo jednu:

my_list <- list(element_1 = 1,
                element_2 = "Beograd", 
                element_3 = TRUE)
str(my_list)
## List of 3
##  $ element_1: num 1
##  $ element_2: chr "Beograd"
##  $ element_3: logi TRUE

Funkcija str() u R je generička, što znači da može da se koristi na objektima različitih klasa. O tome ćemo još da diskutujemo tokom kursa.

Evo još jedne liste, opis neke osobe:

person <- list(name = "Mark",
               family_name = "Smith",
               phone = "+381661722838383", 
               email = "mark.smith@rcourses.org", 
               age = 40,
               gender = "M", 
               employed = TRUE)
person
## $name
## [1] "Mark"
## 
## $family_name
## [1] "Smith"
## 
## $phone
## [1] "+381661722838383"
## 
## $email
## [1] "mark.smith@rcourses.org"
## 
## $age
## [1] 40
## 
## $gender
## [1] "M"
## 
## $employed
## [1] TRUE

Sve može biti element liste u R - čak i ceo data.frame:

person <- list(name = "Mark",
               family_name = "Smith",
               phone = "+381661722838383", 
               email = "mark.smith@rcourses.org", 
               age = 40,
               gender = "M", 
               employed = TRUE, 
               favorite_dataset = "iris", 
               favorite_dataset_source = iris)

Liste mogu da budu ugnježdene:

ll <- list(e1 = 10, 
           e2 = 20, 
           e3 = list(
             e1 = 20,
             e2 = 40,
             e3 = 15
           ), 
           e4 = 40,
           e5 = list(
             e1 = 12
           ))
ll
## $e1
## [1] 10
## 
## $e2
## [1] 20
## 
## $e3
## $e3$e1
## [1] 20
## 
## $e3$e2
## [1] 40
## 
## $e3$e3
## [1] 15
## 
## 
## $e4
## [1] 40
## 
## $e5
## $e5$e1
## [1] 12

Npr. struktura podataka za opis osoba putem R liste:

persons <- list(name = c("Mark", "Jane"),
                family_name = c("Smith", "Doe"),
                phone = c("+381661722838383", "+381661722838384"),
                email = c("mark.smith@rcourses.org", "jane.doe@rcourses.org"), 
                age = c(40, 42),
                gender = c("M", "F"),
                employed = c(TRUE, FALSE)
                )

Pristup elementima liste:

persons[[1]]
## [1] "Mark" "Jane"

Pristup elementima imenovane liste:

persons$family_name[2]
## [1] "Doe"

Logika struktuiranja podataka je ključna stvar u Data Science. Evo boljeg načina da listama opisujemo osobe, npr. zaposlene u nekoj firmi:

persons <- list(
  p1 = list(name = "Mark",
            family_name = "Smith",
            phone = "+381661722838383",
            email = "mark.smith@rcourses.org",
            age = 40,
            gender = "M",
            employed = TRUE
            ),
  p2 = list(name = "Jane",
            family_name = "Doe",
            phone = "+381661722838385",
            email = "jane.doe@rcourses.org",
            age = 42,
            gender = "F",
            employed = FALSE
            )
)

Pristup elementima liste:

persons[[1]]
## $name
## [1] "Mark"
## 
## $family_name
## [1] "Smith"
## 
## $phone
## [1] "+381661722838383"
## 
## $email
## [1] "mark.smith@rcourses.org"
## 
## $age
## [1] 40
## 
## $gender
## [1] "M"
## 
## $employed
## [1] TRUE

1. data.frame klasa

Ova klasa je zapravo sama centralna stvar sa kojom radimo u programskom jeziku R:

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Jedinstveni elementi varijable (kolone, polja, kako hoćete) Species u iris funkcijom unique():

unique(iris$Species)
## [1] setosa     versicolor virginica 
## Levels: setosa versicolor virginica

Gnježđenje poziva funkcija u R - ovo radimo baš često. Npr. “daj mi dužinu (length) vektora dobijenog nabrajanjem jedinstvenih elemenata (unique) kolone Sepal.Length iz iris” se u R piše ovako:

length(
  unique(
    iris$Sepal.Length
    )
  )
## [1] 35

length() nam vraća dužinu vektora ili liste:ß

length(iris$Sepal.Length)
## [1] 150

dim() nam daje dimenzije nekog data.frame npr:ß

dim(iris)
## [1] 150   5

dim() vraća vektor (npr. broj redova i broj kolona za data.frame klasu); ne zaboravite da i sam rezultat neke funkcije u R možete da “sabsetujete”, odn. uzmete indeksiranjem samo onaj deo rezultata koji vam treba; npr. koliko redova ima iris:

dim(iris)[1]
## [1] 150

Čitanje za narednu sesiju

R Markdown

R Markdown je ono što koristimo da bismo razvili ove sveščice. Evo knjige iz koje se može naučiti rad u toj jednostavnoj ekstenziji R: R Markdown: The Definitive Guide, Yihui Xie, J. J. Allaire, Garrett Grolemunds..


Goran S. Milovanović, Data Scientist & Vlasnik, DataKolektiv.
Kontakt: goran.milovanovic@datakolektiv.com. Ovo je besplatan i slobodan softver: GPL v2.0.