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.