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.
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
data.frame
klasaOva 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
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.