1 Procvičování 11 - řešení Naimportujte do R dataframy spe a env z excelového souboru dat09.xls ve studijních materiálech (cv09). 1. Vytvořte funkci minmaxO, která vrátí nejnižší a nevyšší hodnotu ve vektoru. Otestujte funkci na libovolném vektoru. minmax<- function(x){ c(min(x), max(x)) > minmax(c(2,-3,1,5,0)) ## [1] -3 5 # co když budou v x nejaké NA hodnoty? pak by se hodilo ponechat prostor pro použiti # argumentu na.rm= ve funkcich min() a max(), pripadne tento argument použit: minmax<- function(x, ...){ c(min(x, . ..), max(x, ...)) > minmax(c(2,-3,1,5,0)) ## [1] -3 5 minmax( c (2, - 3,1,5, NA) ) ## [1] NA NA minmax(c(2,-3,l,5,NA), na.rm= T) ## [1] -3 5 # pokud explicitne na.rm= použijeme v nasi funkci, muzeme mu přiřadit defaultni hodnotu # treba TRUE: minmax<- function(x, na.rm= T){ # (funkce minmax bude funkci x a na.rm, argument na.rm jsem schválne pojmenoval na.rm, # protože tak se jmenuje i v jiných funkcich, mohl by se jmenovat ale jakkoliv jinak). c(min(x, na.rm= na.rm), max(x, na.rm= na.rm)) > # nenechte se zmást tim na.rm= na.rm. prvni na.rm= je argument funkce min(), # druhé na.rm (to za rovnitkem) je argument nasi minmaxO funkce, který nese hodnotu TRUE, # pokud ji pri použiti funkce minmaxO nezmenime na FALŠE. # rikame tak R, aby ve funkci min() použil argument na.rm= tak, jak jsme ho použili ve funkci # minmaxO minmax(c(2,-3,l,5,NA)) ## [1] -3 5 minmax(c(2,-3,l,5,NA), na.rm= F) ## [1] NA NA 2 2. Vytvořte funkci mocnina(), která vrátí umocněné hodnoty na druhou. mocnina<- function(x){ x~2 > mocnina(c(l,3,5)) ## [1] 1 9 25 3. Vytvořte funkci myplotO, která v bodovém grafu zobrazí proti sobě 2 zadané vektory. par(mar= c(4,4,l,l)) myplot<- function(x, y){ plot(y ~ x) > myplot(l:10, (1:10)~2) O O O o o o o o o i-1-1-1-r 2 4 6 8 10 x 4. Do funkce myplotO přidejte argument group=, která zajistí odlišení bodů v grafu pomocí různých symbolů. Otestujte na proměnných depth, fr a gr dataframu env. par(mar= c(4,4,l,l)) myplot<- function(x, y, group){ plot(y ~ x, pch= as.numeric(group)) > myplot(env$depth, env$fr, env$gr) ## Warning: Name partially matched in data frame O O 00 O CD O ^1- O C\J O — 3 ^1-o CM O O O X /s o o O X X O X o O o o o 0) o o o A O A 0.2 0.3 0.4 0.5 5. Do funkce myplotO přidejte argument . . ., který ponechá možnost přidání dalších argumentů funkce plot(), například nastavení větší nebo menší velikosti bodů v grafu. Otestujte na proměnných depth, fr a gr dataframu env, zkuste několik variant s různě velkými symboli. par(mar= c(4,4,l,l)) myplot<- function(x, y, group, ...){ plot(y ~ x, pch= as.numeric(group), ...) > myplot(env$depth, env$fr, env$gr, cex= 1.8) ## Warning: Name partially matched in data frame o CM O O O 0.2 0.3 0.4 0.5 6. Vytvořte funkci showmeO, která zobrazí prvních 5 řádků a sloupců zadaného tabulkového objektu. Otestujte na dataframu spe. 4 showme<- function(tab){ return(tab[l:5, 1:5]) > showme(spe) ## ablabesp apsetrif ## sOl 0 1 ## s02 1 1 ## s03 0 2 ## s04 0 0 ## s05 1 0 brilmode brilflav cladotsp 0 0 0 0 13 0 0 1 0 0 5 2 1 18 7. Upravte funkci showmeO tak aby zobrazila prvních 5 a posledních 5 řádků a sloupců zadaného tabulkového objektu. showme<- function(dtf){ nRow<- nrow(dtf) nCoK- ncol(dtf) dtf[c(l:5, (nRow-4):nRow), c(l:5, (nCol-4):nCol)] > showme(spe) ## ablabesp apsetrif brilmode brilflav cladotsp tanytasp thellasp ## sOl 0 1 0 0 0 4 5 ## s02 1 1 0 1 3 1 9 ## s03 0 2 0 0 1 8 3 ## s 04 0 0 0 0 5 12 4 ## s05 1 0 2 1 18 31 16 ## s23 0 0 0 0 22 5 3 ## s 24 0 0 0 0 2 4 1 ## s25 0 0 0 1 0 11 0 ## s26 3 6 0 1 9 47 5 ## s27 0 3 9 1 2 4 2 ## thiegrge tvetbaca tvetdive ## sOl 5 4 4 ## s02 15 11 7 ## s03 8 8 5 ## s 04 17 2 1 ## s05 59 2 0 ## s23 6 0 0 ## s 24 6 177 116 ## s25 1 1 1 ## s26 127 1 1 ## s27 32 0 2 8. Přidejte do funkce showmeO argument n=, pomocí něhož budé možné specifikovat, kolik (n) prvních a posledních řádků zadaného tabulkového objektu bude zobrazeno. Jako default nastavte hodnotu n na 5. Počet sloupců nechejte na 5 + 5. 5 showme<- function(dtf, n){ nRow<- nrow(dtf) nCoK- ncol(dtf) dtf[c(l:n, (nRow-(n-l)):nRow), c(l:n, (nCol-(n-1)):nCol)] > showme(spe, 3) ## ablabesp apsetrif brilmode thi egrge tvetbaca tvetdive ## sOl 0 1 0 5 4 4 ## s02 1 1 0 15 11 7 ## s03 0 2 0 8 8 5 ## s25 0 0 0 1 1 1 ## s26 3 6 0 127 1 1 ## s27 0 3 9 32 0 2 9. Vytvořte funkci colstatO, která vrátí počet nenulových hodnot, minimální, mediánovou a maximální hodnotu těchto nenulových hodnot pro všechny sloupce zadaného tabulkového objektu (mat). Zjištěné hodnoty nechť jsou uspořádány do matice, kde řádky odpovídají sloupcům mat a ve sloupcích jsou jednotlivé statistiky (nenul, min, medián, max). Řádky výsledné matice nechť jsou seřazeny sestupně podle mediánu. Otestujte na dataframu spe. # tady rmizeme použit reseni z přikladu 10, jen ho zobecnime a malicku upravime colstat<- function(dtf){ stat<- matrix(NA, nrow= ncol(dtf), ncol= 4) dimnames(stat)<- list(names(dtf), c("non-zeros", "min", "medián", "max")) for(i in names(dtf)){ vals_i<- dtf[, i] # vals_i obsahuje vytažené hodnoty sloupce i nuly_i<- vals_i == 0 # nuly_i označuji nulové hodnoty sloupce i stat[i, "non-zeros"]<- sum(!nuly_i) stat[i, "min"]<- min(vals_i[!nuly_i]) stat[i, "medián"]<- medián(vals_i[!nuly_i]) stat[i, "max"]<- max(vals_i[!nuly_i]) > return(stat) > colstat(spe[, 1:10]) ## non-zeros min medián max ## ablabesp 4 1 1.0 3 ## apsetrif 8 1 2.0 9 ## brilmode 3 1 2.0 9 ## brilflav 11 1 1.0 4 ## cladotsp 17 1 3.0 73 ## corysp. 26 1 14.0 43 ## cricannu 5 1 1.0 2 ## cricbici 7 1 1.0 2 6 ## cricbigr ## crictrgr 16 12 2.5 2.0 13 8 10. Teď připojíme knihovnu balíku vegan a uděláme ordinaci pakomářích společenstev pomocí korespondenční analýzy (CA). Vyextrahujeme skóre lokalit na prvních dvou osách ordinace a s těmi budeme dál pracovat. par(mar= c(4,4,l,l)) library(vegan) ## Loading required package: permute ## Loading required package: lattice ## This is vegan 2.0-10 cal<- cca(loglp(spe)) scl<- scores(cal, display= 'sites') plot(scl) O C\j CM < O o o T -2 -1 CA1 11. Vytvořte funkci show.species(), která v zadané ordinaci odliší symboly lokality, na kterých se zadaný druh vyskytoval od ostatních. Výsledek by měl vypadat asi takhle: par(mar= c(4,4,l,l)) show.species(scl, "prodoliv") 7 + + + + + + ++ + + + ■ + 1 1 -2 -1 I 0 I 1 CA1 # jedno z možných reseni (slo by to i bez funkce points ()): show.species<- function(ordinace, druh){ plot(ordinace, type= 'n') points(ordinace, pch= c(3,15)[factor(spe[,druh] > 0)]) > # argument type= n u funkce plot() zajisti, ze neni nic zobrazeno, jen je vytvořeno grafické okno, # s nastaveným rozsahem os. # všimnete si take, ze pro zobrazeni lokalit v dvourozměrném prostoru jejich skoré # (vlastne se jedna o 2 proměnné, prvni a druhou osu) štaci plot(skoré), samozrejme # bychom mohli použit i plot(skore[, 1], skore[,2]), nebo plot(skoré[,2]~skore[,1]) apod. 12. Přidejte do funkce show. species() argument, pomocí něhož bude možné specifikovat symboly a barvy bodů zobrazovaných v grafu (samozřejmě aby jedna barva a jeden symbol patřil lokalitám s výskytem druhu a druhá barva a symbol těm ostatním). Příklad: par(mar= c(4,4,l,l)) show.species(sel, "prodoliv", col=c('orange','skyblue'), pch= c(2,16)) 8 CM < O o m o i T a a a & a a a -2 aA^ -1 CA1 show.species<- function(ordinace, druh, col, pch){ plot(ordinace, type= 'n') points(ordinace, pch= pch[factor(spe[,druh] > 0)], col= col[factor(spe[,druh] > 0)]) > 13. Přidejte do funkce show.species() argument .. ., pomocí něhož bude možné specifikovat další grafické argumenty, například velikost symbolů. show.species<- function(ordinace, druh, col, pch, ...){ plot(ordinace, type= 'n', ...) points(ordinace, pch= pch[factor(spe[,druh] > 0)], col= col[factor(spe[,druh] > 0)], ...) > # ... musi byt ve funkci function() a u jedné z funkci plot() a points(), # mohou byt i u obou. # pozorni jedinci by v tuto chvili uz dokázali napsat funkci, která by z datasetu # vytáhla zadaný počet nejbeznejsich druhu a zobrazila je obdobným způsobem v ordinaci, # treba jeste s velikosti symbolu odpovidajici (pravdepodobne transformovane, treba sqrt) # abundanci druhu na lokalitách :)