1 Procvičování 9 - řešení 1. Importujte do R tabulku jmen s daty narození českých občanů jmena.txt. Nazvěte ji jm.data. Tabulka obsahuje v řádcích všechna jednoslovná křestní jména českých obyvatel, ve sloupcích pak jejich frekvenci v jenotlivých ročnících od r. 1896 do 2013. Tabulka je docela velká, nepokoušejte se ji proto celou zobrazit v R, nechejte si raději vypsat jen prvních pár řádků a sloupců. Najdete ji ve studijních materiálech, nebo ji můžete načíst přímo z http: //www. sci .muni. cz/~syrovat/ jmena.txt, to ale bude chvilku trvat. # Mam problém s encodovanim v LyXu, nepodařilo se mi pres LyX nacist správné jména # s diakritikou, coz způsobuje, ze některá jména jsou zdánlivé duplikovana. # Načtu proto dataset bez jmen radku, odstranim duplikovana jména, a pak teprve definuji # jména radku. # Nastaveni pracovního adresáře: setwd("D:/My Dropbox/predmety/uvod do R/2014/cv09") # načteni jmen bez jmen radku, zabranim vytvořeni faktoru ze jmen a kontrole jmen sloupců: jm.data<- read.delim('jména.txť, sep= '\ť, check.names= F, stringsAsFactors= F) # odstraněni radku s duplikovanymi jmény: jm.data<- jm.data[!duplicated(jm.data[, 1]), ] # definováni jmen radku: jm.data<- data.frame(jm.data, row.names= 1) ## Error: row names contain missing values # R hlasi, ze mezi jmény jsou missing values (NA), odstranim i ty: jm.data<- jm.data[!is.na(jm.data[, 1]), ] # definováni jmen radku podruhé: jm.data<- data.frame(jm.data, row.names= 1) 2. Do vektoru jm.freq vypočítejte frekvenci výskytu jednotlivých jmen v české populaci. jm.freq<- rowSums(jm.data) 3. Do vektoru jm si vytáhněte křestní jména z dataframu jm.data. jm<- rownames(jm.data) 4. Seřaďte křestní jména podle abecedy a nechejte si zobrazit prvních a posledních 20. sort(jm)[1:20] ## [1] "" ## [6] "\016AKLE" ## [11] "\016ANET" ## [16] "\016ANNETA \016AMETA \016ARK0" \016ABER" \016AKLIM II \016AKELIM \016ANA" \016ANETKA \016AV" II II \016AKELIM \016AMRGUL \016ANETTA" \016EANETA" " "\016AKELMM " "\016ANDA" \016AMM \016ELAM II # Vas výsledek by mel byt jiny (lepši), me zlobi to kódováni v LyXu. 2 5. Zjistěte nejdelší křestní jméno. Postup: vytvořte si vektor délek jmen, seřaďte jména podle jejich délek od nej vyšších po nejnižší a vyberte první. Délkou rozumíme počet znaků (characters). Funkci, která zjistí délku textového řetězce musíte vyhledat. # Hledáme funkci, která vrati počet znaku v nějakém řetězci, anglicky "number o f characters". # Nejprve muzeme zkusit hledáni funkce uvnitř nasi instalace R pomoci ??. # ??"number of characters" # mi vrátilo funkci nchar z baliku base (psáno base::nchar). # Pripadne (nebo pokud ?? nefunguje) muzeme primo hledat na googlu. Jeden z prvnich # odkazu určite bude směrovat na stejnou funkci. # Abychom zjistili, jak funkci použit, podivame se na jeji nápovědu: # ?nchar # Vektor délek jmen (poctu znaku ve jménech): jm.nchar<- nchar(jm) # Ted štaci jména seřadit sestupné podle délek a vybrat prvni: jm[order(-jm.nchar)[1]] ## [1] "ANDRIAMNDRAIM" # Tohle mame snad všichni stejné. 6. Nechejte si vypsat 100 nejkratších jmen. jm[order(jm.nchar)[1:100]] ## [1] 11 11 "E" "A" IľJMI "R" 11 J 11 "M" "0" lipil "U" "V" ## [12] "KA" "AI" "AJ" "AL" "AM" "IK" »TI" "TA" "AR" "ES" "0M" ## [23] "0T" "BA" "IR" "BI" "BO" "K0" "DA" "JA" "DE" "DI" "DO" ## [34] "DU" "ED" "EL" "AD" "EK" "GA" "HA" "IM" "EM" "HI" "AM" ## [45] "MK" "JE" "JO" "KE" "Kí" "AV" "OF" "MM" "LA" "LE" "LY" ## [56] "MA" "MI" "M0" "MR" "MY" "OK" "OR" "0Z" "PA" "PE" "PI" ## [67] "IA" "RA" "MD" "RI" "RM" "RU" "ID" "RY" "R] " "SA" "SI" ## [78] "SY" "ON" "TE" "TL" "TU" "TZ" icpY" "IE" "UR" "AK" "VI" ## [89] "VM" "VU" "IM" "VY" "WU" "YA" "YE" "YI" "ZO" "ABA" "ABE ## [100] "ABI" # opet, vas výsledek bude jiny. 7. Nechejte si vypsat 50 nejběžnějších jmen. jm[order(-jm.freq)[1:50]] ## [1] "JIXM" "JAN" ## [6] "JOSEF" "PAVEL" ## [11] "MIROSLAV" "HAMA" ## [16] "LENKA" "KATEXIMA ## [21] "LUCIE" "ALENA" ## [26] "JAROSLAVA" "VLADIMMR ## [31] "TEREZA" "LUDMILA" "MARIE" "PETR" "JANA" "MARTIN" "JAROSLAV" "EVA" "ANNA" "ZDENLK" "MICHAL" "VLRA" "MILAN" "KAREL" "PETRA" "JAKUB" "DAVID" "VERONIKA" "MARTINA" "JITKA" "HELENA" "MICHAELA" "LADISLAV 3 ## [36] "ZDERKA" ## [41] "JARMILA ## [46] "MARKITA II II "ONDXEJ" "MONIKA" "RADEK" "IVANA" "MAREK" "DANIEL "ROMAN" "ZUZANA" "ANTONMN STANISLAV JIXINA" MARCELA" # tady taky vas výsledek bude jiny. 8. Zjistěte, zda se Vaše jméno nachází mezi 50 nejběžnějšími. # 50 nejbeznejsich jmen uz umime zjistit, ted se jen zeptáme, zda to nase je mezi nimi: "VIT" '/.in'/. jm[order(-jm.freq) [1:50]] ## [1] FALŠE # Pokud bychom neznali '/,in'/, operátor, muzeme se porovnat nase jméno # s kazdym z 50 nejbeznejsich a secist logické hodnoty vzešle z tohoto porovnáni. # Pokud je jejich suma > 0, pak se moje jméno vyskytuje mezi temi 50: sum("VIT" == jm[order(-jm.freq)[1:50]]) > 0 ## [1] FALŠE 9. Zjistěte kolikáté nejběžnější je Vaše jméno. # Muzeme využit toho, ze jména rozmeru (radku ci sloupců) se pri výpočtech # mezi objekty prenaseji. Štaci zjistit poradi (rank) frekvenci jmen a vyhledat # poradi daného jména. Zajima nas samozrejme poradi od nejvyssi po nejnizsi prekvenci: rank(-jm.freq)["VIT"] # Stejného dosáhneme i tak, ze ke jmenum pripojime jejich ranky, a pak se podivame na radek # daného jména. Zobrazit muzeme i frekvenci: jm.dtf<- data.frame(jmena= jm, jm.freq= jm.freq, jm.rank= rank(-jm.freq), row.names= 1) jm.dtf["VIT", ] 10. Naimportujte do R dataframy spe a env a vektor korelací abundancí jednotlivých druhů s Frou-deho číslem korelace. Použijte funkce read.delimO a scan(). Vše najdete v dat09.xls. spe<- read.delim('D:/My Dropbox/predmety/uvod do R/2013/cv09/spe.txť, row.names=l) env<- read.delim('D:/My Dropbox/predmety/uvod do R/2013/cv09/env.txť, row.names=l) kor <- scanO 11. Nechejte si vypsat zaokrouhlené hodnoty Froudeho čísla (na 2 desetinná místa) seřazené od nejmenší po největší, a pak od největší po nejmenší. ## VIT ## 6486 ## VIT jm.freq jm.rank 2 6486 4 sort(round(env$froude, 2)) ## [1] 0.00 0.02 0.04 0.05 0.05 0.07 0.07 0.13 0.13 0.14 0.14 0.14 0.17 0.18 ## [15] 0.18 0.22 0.24 0.30 0.30 0.33 0.41 0.43 0.48 0.51 0.52 0.54 0.56 sort(round(env$froude, 2), decreasing=T) ## [1] 0.56 0.54 0.52 0.51 0.48 0.43 0.41 0.33 0.30 0.30 0.24 0.22 0.18 0.18 ## [15] 0.17 0.14 0.14 0.14 0.13 0.13 0.07 0.07 0.05 0.05 0.04 0.02 0.00 12. Zjistěte 5 nejnižších a 5 nejvyšších hodnot Froudeho čísla, sort(env$froude)[1:5] ## [1] 0.001813 0.020319 0.039662 0.046165 0.051925 sort(env$froude, decreasing= T)[l:5] ## [1] 0.5584 0.5395 0.5225 0.5071 0.4767 # nebo naraz treba takhle: sort(env$froude)[c(l:5, (length(env$froude)-4) : length(env$froude))] ## [1] 0.001813 0.020319 0.039662 0.046165 0.051925 0.476675 0.507082 ## [8] 0.522477 0.539509 0.558432 13. Nechcejte si vypsat jména 5 lokalit s nejvyšším Froudeho číslem. rownames(env)[order(env$froude, decreasing=T)][1:5] ## [1] "s24" "s25" "sl2" "s21" "s20" 14. Do dataframu env přidejte proměnné iná a spec obsahující celkové počty jedinců a druhů pako-márů na lokalitách. env$ind<- rowSums(spe) env$spec<- rowSums(spe>0) 15. Nechejte si vypsat počty druhů seřazené podle Froudeho čísla od nejmenšího po největší. env$spec[order(env$froude)] ## [1] 31 28 27 19 26 29 25 15 20 16 22 19 17 27 22 21 31 26 30 23 19 17 20 ## [24] 28 24 19 31 16. Nechejte si vypsat dataframe env seřazený podle Froudeho čísla od nejvyššího po nejnižší. 5 env[order(-env$froude),] ## gr depth vel froude ind spec ## s 24 Er_VEG 0, ,300 0, ,958 0, ,558432 678 31 ## s25 Er 0, ,139 0, ,630 0, ,539509 47 19 ## sl2 Er_VEG 0, ,245 0, ,810 0, ,522477 450 24 ## s21 Er_VEG 0, ,138 0, ,590 0, ,507082 531 28 ## s20 Er 0, ,290 0, ,804 0, ,476675 221 20 ## s08 Er 0, ,213 0, ,618 0, ,427528 146 17 ## slO Er_VEG 0, ,353 0, ,758 0, ,407331 212 19 ## s09 Er 0, ,243 0, ,508 0, ,329023 220 23 ## sl5 Er_VEG 0, ,279 0, ,496 0, ,299809 738 30 ## s07 Er 0, ,278 0, ,490 0, ,296715 258 26 ## sl8 Er_VEG 0, ,200 0, ,340 0, ,242733 565 31 ## sll Er_VEG 0, ,236 0, ,334 0, ,219511 181 21 ## s 14 Ep 0, ,155 0, ,224 0, ,181655 150 22 ## s02 Ep 0, ,422 0, ,358 0, ,175951 405 27 ## sl6 Ep 0, ,501 0, ,372 0, , 167799 122 17 ## s03 Ep 0, ,496 0, ,310 0, ,140536 146 19 ## sOl Ep 0, ,395 0, ,274 0, ,139193 139 22 ## sl7 Ep 0, ,454 0, ,286 0, , 135520 243 16 ## s22 Ep 0, ,340 0, ,246 0, ,134698 122 20 ## s23 Ep 0, ,344 0, ,234 0, ,127380 145 15 ## s06 Ep_FP0M 0, ,328 0, ,126 0, ,070242 611 25 ## s13 Ep_CP0M 0, ,184 0, ,088 0, ,065500 569 29 ## s05 Ep_FP0M 0, ,320 0, ,092 0, ,051925 489 26 ## s04 Ep_FP0M 0, ,291 0, ,078 0, ,046165 183 19 ## sl9 Ep 0, ,162 0, ,050 0, ,039662 198 27 ## s27 Ep_CP0M 0, ,478 0, ,044 0, ,020319 416 28 ## s26 Ep_CP0M 0, ,124 0, ,002 0, ,001813 893 31 17. Zjistěte, kolik druhů a kolik jedinců pakomárů bylo na 5 lokalitách s nejvyšším Froudeho číslem (vyberte jen příslušné elementy z proměnných ind a spec dataframu env). env[order(env$froude, decreasing=T)[1:5], c( ' inď , ' spec')] ## ind spec ## s24 678 31 ## s25 47 19 ## s12 450 24 ## s21 531 28 ## s20 221 20 18. Zjistěte, jaké Froudeho číslo bylo naměřeno na 3 lokalitách s nejvyšším počtem jedinců pakomárů. env$froude[order(env$ind, decreasing=T)[1:3]] ## [1] 0.001813 0.299809 0.558432 6 19. Nechejte si vypsat dataframe env s lokalitami seřazenými podle Froudeho čísla. env[order(env$froude),] ## gr depth vel froude ind spec ## s26 Ep_CP0M 0, ,124 0, ,002 0, ,001813 893 31 ## s27 Ep_CP0M 0, ,478 0, ,044 0, ,020319 416 28 ## sl9 Ep 0, ,162 0, ,050 0, ,039662 198 27 ## s04 Ep_FP0M 0, ,291 0, ,078 0, ,046165 183 19 ## s05 Ep_FP0M 0, ,320 0, ,092 0, ,051925 489 26 ## s13 Ep_CP0M 0, ,184 0, ,088 0, ,065500 569 29 ## s06 Ep_FP0M 0, ,328 0, ,126 0, ,070242 611 25 ## s23 Ep 0, ,344 0, ,234 0, , 127380 145 15 ## s22 Ep 0, ,340 0, ,246 0, ,134698 122 20 ## sl7 Ep 0, ,454 0, ,286 0, , 135520 243 16 ## sOl Ep 0, ,395 0, ,274 0, ,139193 139 22 ## s03 Ep 0, ,496 0, ,310 0, ,140536 146 19 ## sl6 Ep 0, ,501 0, ,372 0, ,167799 122 17 ## s02 Ep 0, ,422 0, ,358 0, ,175951 405 27 ## s 14 Ep 0, ,155 0, ,224 0, ,181655 150 22 ## sil Er_VEG 0, ,236 0, ,334 0, ,219511 181 21 ## sl8 Er_VEG 0, ,200 0, ,340 0, ,242733 565 31 ## s07 Er 0, ,278 0, ,490 0, ,296715 258 26 ## sl5 Er_VEG 0, ,279 0, ,496 0, ,299809 738 30 ## s09 Er 0, ,243 0, ,508 0, ,329023 220 23 ## slO Er_VEG 0, ,353 0, ,758 0, ,407331 212 19 ## s08 Er 0, ,213 0, ,618 0, ,427528 146 17 ## s20 Er 0, ,290 0, ,804 0, ,476675 221 20 ## s21 Er_VEG 0, ,138 0, ,590 0, ,507082 531 28 ## sl2 Er_VEG 0, ,245 0, ,810 0, ,522477 450 24 ## s25 Er 0, ,139 0, ,630 0, ,539509 47 19 ## s 24 Er_VEG 0, ,300 0, ,958 0, ,558432 678 31 20. Nechejte si vypsat dataframe env s lokalitami seřazenými podle typu habitatu (gr) a uvnitř typů podle hloubky vody. env[order(env$gr, env$depth),] ## gr depth vel froude ind spec ## sl4 Ep 0.155 0.224 0.181655 150 22 ## sl9 Ep 0.162 0.050 0.039662 198 27 ## s22 Ep 0.340 0.246 0.134698 122 20 ## s23 Ep 0.344 0.234 0.127380 145 15 ## sOl Ep 0.395 0.274 0.139193 139 22 ## s02 Ep 0.422 0.358 0.175951 405 27 ## sl7 Ep 0.454 0.286 0.135520 243 16 ## s03 Ep 0.496 0.310 0.140536 146 19 ## sl6 Ep 0.501 0.372 0.167799 122 17 ## s26 Ep_CP0M 0.124 0.002 0.001813 893 31 ## sl3 Ep_CP0M 0.184 0.088 0.065500 569 29 7 ## s27 Ep_CPOM 0 .478 0 .044 0 ,020319 416 28 ## s04 Ep_FPOM 0 .291 0 .078 0, ,046165 183 19 ## s05 Ep_FPOM 0 .320 0 .092 0, ,051925 489 26 ## s06 Ep_FPOM 0 .328 0 .126 0, ,070242 611 25 ## s25 Er 0 .139 0 .630 0, ,539509 47 19 ## s08 Er 0 .213 0, .618 0, ,427528 146 17 ## s09 Er 0 .243 0, .508 0, ,329023 220 23 ## s07 Er 0 .278 0, ,490 0, 296715 258 26 ## s20 Er 0 .290 0, ,804 0, 476675 221 20 ## s21 Er_VEG 0, ,138 0, ,590 0. 507082 531 28 ## sl8 Er_VEG 0, ,200 0, ,340 0. 242733 565 31 ## sll Er_VEG 0, ,236 0, ,334 0. 219511 181 21 ## sl2 Er_VEG 0, ,245 0, ,810 0. 522477 450 24 ## sl5 Er_VEG 0, ,279 0. ,496 0. 299809 738 30 ## s24 Er_VEG 0, ,300 0. ,958 0. 558432 678 31 ## slO Er_VEG 0, 353 0, 758 0. 407331 212 19 21. Nechejte si vypsat jména pěti nejfrekventovanějších druhů (tedy těch s výskytem na nejvyšším počtu lokalit). names(spe)[order(-colSums(spe>0))[1:5]] ## [1] "orthobum" "synosemi" "corysp." "mictrasp" "thiegrge" 22. Nechejte si vypsat jména druhů seřazená podle jejich korelací s Froudeho číslem. names(spe)[order(kor)] ## [1] "micrchgr" "thiegrge" "cromussp" "cladotsp" "apsetrif" "natasp." ## [7] "prodoliv" "polyscgr" "paraalgr" "corysp." "tanytasp" "tanybrun ## [13] "ablabesp" "phaepssp" "synosemi" "stembrgr" "cricbici" "thellasp ## [19] "brilmode" "hetemarc" "nilodubi" "paratasp" "polyconv" "demisp." ## [25] "mictrasp" "orthobum" "pararufi" "brilflav" "diplcult" "eukisimi ## [31] "rheofusc" "paracrsp" "pottgaed" "eukigrgr" "eukibrev" "orthfrig ## [37] "nanoreag" "eukicoer" "eukimino" "parastyl" "cricannu" "critriia ## [43] "polylagr" "orthrubi" "crictrgr" "rheotasp" "pottlong" "orthrigr1 ## [49] "eukideil" "tvetbaca" "eukilobi" "cricbigr" "orththie" "tvetdive1 23. Zjistěte, kterých 10 druhů nejlépe koreluje s Froudeho číslem. Pozor na to, že korelace může být kladná nebo záporná, zajímají nás druhy, které nejlépe na hydraulické podmínky reagují, tedy ty s nejnižší a nej vyšší korelací (při řazení tedy použijeme absolutní hodnoty korelací). names(spe)[order(-abs(kor))][1:10] ## [1] "micrchgr" "thiegrge" "tvetdive" "cromussp" "orththie" "cricbigr" ## [7] "eukilobi" "cladotsp" "tvetbaca" "apsetrif" 8 24. Vytvořte kopii dataframu spe, v níž bude 7 druhů které nejlépe reagovaly na hydraulické podmínky. spe.red<- spe[, order(-abs(kor)) [1:7]] spe.red ## micrchgr thiegrge tvetdive cromussp orththie cricbigr eukilobi ## sOl 25 5 4 0 0 2 3 ## s02 31 15 7 0 0 7 1 ## s03 31 8 5 0 0 0 0 ## s 04 14 17 1 0 0 0 0 ## s05 3 59 0 1 0 0 0 ## s06 31 61 0 4 0 1 1 ## s07 0 5 9 0 0 2 2 ## s08 0 0 4 0 1 1 1 ## s09 0 1 5 0 2 7 2 ## s 10 0 0 17 0 0 6 4 ## sil 0 1 12 0 0 7 2 ## s 12 0 1 32 0 1 13 4 ## s 13 213 72 0 2 0 0 0 ## s 14 0 3 2 1 0 2 1 ## s 15 9 17 64 0 1 3 14 ## s 16 0 1 1 0 0 2 1 ## s 17 1 4 0 0 1 0 1 ## s 18 0 3 53 0 1 9 6 ## s 19 25 14 2 1 0 0 8 ## s20 0 13 41 0 0 0 3 ## s21 0 1 87 0 3 2 7 ## s22 8 13 5 6 0 0 0 ## s23 5 6 0 7 0 0 0 ## s 24 0 6 116 0 2 3 7 ## s25 0 1 1 0 1 1 1 ## s26 287 127 1 5 0 0 0 ## s27 126 32 2 2 0 0 0 25. Seřaďte sloupce tohoto dataframu podle typu odezvy (kladná nebo záporná korelace), a uvnitř každého typu podle síly korelace (první budou ty s nejvyšší odezvou). Řádky pak seřaďte podle Froudeho čísla. # V predchozim bode jsme vybrali 7 druhu s nejsilnejsi odezvou. # Těchto 7 druhu ted potrebujeme dal seřadit podle jejich korelaci, a na to potrebujeme mit # vytažené korelace jen těchto 7 druhu. Vytáhneme si je stejné, jako jsme vybrali ty druhy: kor.red<- kor[order(-abs(kor))[1:7]] # Nyni mame dataframe s abundancemi 7 vybraných druhu (spe.red) # a vektor jejich korelaci (kor.red). # Štaci tedy seřadit radky a sloupce dataframu spe.red a jsme hotovi: spe.red.sort<- spe.red[order(env$froude), order(kor.red>0, -abs(kor.red))] spe.red.sort ## micrchgr thiegrge cromussp tvetdive orththie cricbigr eukilobi 9 ## s26 287 127 5 1 0 0 0 ## s27 126 32 2 2 0 0 0 ## sl9 25 14 1 2 0 0 8 ## s 04 14 17 0 1 0 0 0 ## s05 3 59 1 0 0 0 0 ## sl3 213 72 2 0 0 0 0 ## s06 31 61 4 0 0 1 1 ## s23 5 6 7 0 0 0 0 ## s22 8 13 6 5 0 0 0 ## sl7 1 4 0 0 1 0 1 ## sOl 25 5 0 4 0 2 3 ## s03 31 8 0 5 0 0 0 ## sl6 0 1 0 1 0 2 1 ## s02 31 15 0 7 0 7 1 ## s 14 0 3 1 2 0 2 1 ## sil 0 1 0 12 0 7 2 ## sl8 0 3 0 53 1 9 6 ## s07 0 5 0 9 0 2 2 ## sl5 9 17 0 64 1 3 14 ## s09 0 1 0 5 2 7 2 ## slO 0 0 0 17 0 6 4 ## s08 0 0 0 4 1 1 1 ## s20 0 13 0 41 0 0 3 ## s21 0 1 0 87 3 2 7 ## sl2 0 1 0 32 1 13 4 ## s25 0 1 0 1 1 1 1 ## s 24 0 6 0 116 2 3 7 26. Exportujte do excelu výsledný dataframe. Použijte funkci write.table(). write.table(spe.red.sort, file= 'D:/My Dropbox/predmety/uvod do R/2014/cv09/spe.red.txt', sep= '\t1, col.names = MA, row.names = TRUE)