Cvičenie 2 - Funkcie pre cyklické spracovanie, načítanie dát a práca s knižnicou dplyr
Cieľom druhého cvičenia je osvojiť si použitie funkcií pre cyklické spracovanie, nacítať dáta z rôznych súborov a predspracovať ich pomocou knižnice dplyr.
Funkcie pre cyklické spracovanie ¶
1. apply()¶
Funkcia apply() sa používa na evaluáciu funkcie v rámci ohraničení poľa. To znamená, že si vyberiem pole (často sú to riadky alebo stĺpce matice), na ktoré aplikujem zvolenú funkciu.
Prvý uvedený príklad aplikuje funkciu sum na stpĺce a následne na riadky matice M. Spusti skript a sleduj čo sa udeje v druhom príklade.
M =matrix(1:6,3,2)
print(M)
apply(M,2,sum) # sucet jednotlivých stlpcov (2)
apply(M,1,sum) # sucet jednotlivych riadkov (1)
M[3,2]
for(i in 1:dim(M)[2]){
suma = 0
for(j in 1:dim(M)[1]){
suma = suma + M[j,i]
}
print(suma)
}
N = matrix(c(1:10, 11:20), 10, 2)
print(N)
print(apply(N, 1:2, function(x) x/2))
apply(N, 1:2, function(x) x/2) # porovnajte rozdiel vo vypise - plati len pre jupyter notebook
2. lapply(), sapply()¶
Funkcia lapply() sa používa pri zoznamoch (list), pričom výsledok je opäť zoznam (list). Ak máme na vstupe iný dátový typ, môžeme ho jednoducho zmeniť prílazom as.list(). Funkcia sapply() sa snaží zjednodušiť výsledok lapply().
Výsledkom sapply() je:
- vektor (ak elementy majú dĺžku 1),
- matica (ak elementy majú ROVNAKÚ dĺžku, väčšiu ako 1),
- nak vráti zoznam (
list) ako funkcialapply().
# lapply vysledok list
# sapply vysledok vektor/ matica (zjednoduseny lapply)
X = list(a = 1:5, b = 6:10)
X
lapply(X,mean)
sapply(X,mean)
# poznamka: kvantil = hodnota pod ktorou lezi definovana cast udajov - rozmedzie je 0-1
# kvantil 0,5 je median
# kvaRtil = prvy kvartil 25% = kvantil 0.25
# druhy kvartil 50% = kvantil 0.5 = median
# treti kvartil 75% = kvantil 0.75
lapply(X,quantile)
sapply(X,quantile)
lapply(X,quantile,c(0,0.4,1))
sapply(X,quantile,c(0,0.4,1))
Y = list(a = 1, b = 1:3, c = 10:100)
Y
lapply(Y,length)
sapply(Y,length)
lapply(Y,sum)
sapply(Y,sum)
3. mapply()¶
Na základe nasledujúcich príkladov popíšte funkciu mapply():
l1 = list(a = c(1:10), b = c(11:20))
l2 = list(c = c(21:30), d = c(31:40))
mapply(sum, l1$a, l1$b, l2$c, l2$d)
mapply(sum,1:5,1:5,1:5) #1,2,3,4,5 1,2,3,4,5 1,2,3,4,5
mapply(rep, 1:4, 6:9) #1,2,3,4 6,7,8,9
4. tapply(), split()¶
Funkcia tapply() vypočíta zadanú funkciu pre každú faktorovú premennú vo vektore.
Je to veľmi užitočná funkcia, ktorá vám umožňuje vytvoriť podmnožinu vektora a potom aplikovať niektoré funkcie na každú z podmnožín.
Vstupom je vektor a dátovy typ ktorý je alebo môže byť prevedený na faktor.
Funkcia split() rozdelí vstup do skupín podľa faktorov.
x = c(1,2,4,1,5,3,2,1)
x
y = c("ekonometria", "JDA", "ekonometria", "JDA", "SU", "JDA","SU","SU")
y
tapply(x, y, mean)
tapply(x,y,mean,simplify = FALSE)
split(x,y)
fileUrl = "http://people.tuke.sk/peter.butka/res/irisdata.csv"
download.file(fileUrl, destfile = "DATA/iris2.csv")
list.files("DATA")
2. Načítanie lokálnych textových súborov¶
Textové súbory načítavame pomocou read.table(). Pre .csv súbory existuje špeciálny
typ funkcie read.table() a to read.csv() a read.csv2(), pričom:
read.csv()ma default separátor,a desatinnú čiarku.read.csv2()ma default separátor;a desatinnú čiarku,
Spusti nasledujúci skript a popíš funkcie head() a tail().
iris = read.table("DATA/iris.csv", sep = ";",header = TRUE)
# OR
iris1 = read.csv("DATA/iris.csv") # preco nefunguje?
# OR
iris2 = read.csv2("DATA/iris.csv")
head(iris,20)
tail(iris)
3. JSON súborov¶
JSON = JavaScript Object Notation, ukladanie a zdieľaie dát v štruktúrovanej formw key:value.
Otvorte v prehliadači tento JSON súbor a oboznámte sa s jeho štruktúrou.
Následne načítajte tento JSON súbor do R a vykonajte nasludujúce príkazy:
install.packages("curl")
library(jsonlite)
data_json = fromJSON("http://people.tuke.sk/peter.butka/res/data.JSON") # nacitanie dat
names(data_json) # vypise names t.j. NAZVY stlpcov data_json
names(data_json$adresa) # vypise names t.j. NAZVY, data_json$adresa t.j. stlpcov z ktorych sa sklada adresa
data_json$adresa$mesto # vypise z tabulky, zo stplca ADRESA, vsetky MESTA
data_json$meno
Úlohy
Úloha 2.1
Stihanite si dáta zo web stránky http://people.tuke.sk/viera.maslej.kresnakova/JDA/camera.csv,, uložte ich do priečinku DATA a pomenujte ich camera.csv
Úloha 2.2
Načítajte dáta camera ako tabuľku, csv alebo csv2 a vypíšte prvých 5 riadkov.
Úloha 2.3
Načítajte dáta z https://api.github.com/users/jtleek/repos, vypíšte zo stĺpca OWNER všetky LOGIN.
Úlohy na precvičenie
Úloha 2.4
Vytvorte maticu o rozmere 5 riadkov a 7 stĺpcov a naplňte ju párnymi číslami.
Skúste pri tom využiť funkciu seq()
1. Vhodnou funkciou spočítajte priemernú hodnotu jednotlivých stĺpcov.
Výsledok:
6 16 26 36 46 56 66
2. Na všetky prvky matice použite funkciu (x^2 - 1)
Výsledok:
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 3 143 483 1023 1763 2703 3843
[2,] 15 195 575 1155 1935 2915 4095
[3,] 35 255 675 1295 2115 3135 4355
[4,] 63 323 783 1443 2303 3363 4623
[5,] 99 399 899 1599 2499 3599 4899
Úloha 2.5
Načítajte si dataset cars ktorý je súčasťou R napr. ako df=cars
1. Vhodnou funkciou nájdite minimálne a maximálne hodnoty pre oba stĺpce speed a distance.
Výsledok
speed 4
dist 2
speed 25
dist 120
2. Použite vlastnú funkciu avg (min(x)+max(x)/2) na získanie priemeru hodnôt zo stĺpcov speed a distance.
Výsledok
speed 14.5
dist 61
Úloha 2.6
Použite dataset iris a funkciu tapply na získanie hodnoty medián zo stĺpca Petal.Width pre jednotlivé druhy kvetov, ktoré sú v stĺpci Species.
Jednotlivé druhy (kategórie) si môžete zobraziť funkciou unique() pre zvolený stĺpec.
Výsledok
setosa 0.2
versicolor 1.3
virginica 2
Úloha 2.7
Skúste všetky predchádzajúce úlohy nahradiť vlastnými funkciamu použitím cyklusov for, while alebo repeat.