MAI061 cvičení 1
Z ωικι.matfyz.cz
# Tento soubor vznikl drobnou modifikaci soubor kolegy # Matusa Maciaka, ktery vede paralelku. Proto to bude # takova smes slovenstiny a cestiny. ########################################################### ##### 1. CVICENIE - 06.03.2007 ###### ########################################################### # Podrobnosti k cviceniu na mojej web stranke, na adrese: # http://www.mmatthew.matfyz.cz/school.php # Podrobnosti k prednaske na stranke Dr. Hlavku, na adrese: # http://www.karlin.mff.cuni.cz/~hlavka ########################################################### ##### ZAKLADY PRI PRACI S Rkom ###### ########################################################### ### Vsetkych 5 nizsie uvedenych datovych struktur moze nadobudat ### ktorykolvek z datovych typov (num, znak, kompl, log) # 1. Praca s vektormi ### Skuste prikazy na tvorbu vektorov: "c()", "seq()" a "rep()" a <- c(1,3.14,6.28,Inf) b <- seq(2,6,length=4) ### aky je rozdiel medzi "b<-seq(2,6,4)"? # nyni se da v R-ku prirazovat i pomoci "=",tj a = c(1,3.14,6.28,Inf) # ale to staromilci nevidi radi ### nezavislost na poradi vhodne identifikovanych vstupnych parametrov: seq(from=1, to=10, by=.1) seq(to=10, by=.1, from=1) # pokud ale parametry neuvadim jmenem musi byt poradi spravne, R-ko neni # od Microsoftu :) # # Napoveda # o tom jak presne funguje funkce "seq" se dozvime pomoci help(seq); # anebo ?seq # pokud nevite presny nazev prikazu muze pomoci help.search("seq") # pro milovniky html napoved je zde # help.start() # webovy prohlizec, ktery se spusti lze na Linuxu nastavit # pomoci options(browser="/usr/bin/firefox") # Ale aby spravne fungovalo hledatko prikazu, je treba # mit "dobre" nastavenou JAVU # Pokud se nam html napovedu nelibi a chceme se ji zbavit, # pak dame options(htmlhelp = FALSE) ### "naplneni" vektora stejnym cislem... c <- rep(2,4) # jde to samozrejme delat i vektorove rep(c(1,0), c(2,5)) ### Scitanie vektorov: "+/-", nasobenie skalarom: "*", nasobenie vektorov: "%*%" ### transpozicia: "t()" - interpretacia opacna, nez v teorii!!! ### indexovanie vektorov, indexovanie logickymi podmienkami, ... print(a[c(1,3)]) print(a[a>5]) print(a[a>5 & a<Inf]) # vyhodi z indexu druhou slozku a[-2] # prace s vektory # Dokud R-ku nerekneme jinak, tak R-ko pracuje po slozkach a + b a * b # 2. Praca s maticami ### dimenzia matice (vektoru): "dim()", "nrow()", "ncol()", inverzna matica: "solve()", ### pozrite sa na funkcie "cbind()", "rbind()" a "matrix()"... # Matice lze vytvaret ruznymi zpusoby, napr. poslepovanim sloupecku B <- cbind(c(1,2,3),c(0,1,2),c(0,0,1)) # anebo poslepuju radky C <- rbind(c(1,2,3),c(0,1,2),c(0,0,1)) # anebo vyuziju priklad matrix B <- matrix(c(1,2,3,0,1,2,0,0,1), nrow = 3, ncol = 3, byrow = FALSE); # ekvivalentne a strucneji B <- matrix(c(1,2,3,0,1,2,0,0,1), 3, 3); # pristupovat k prvkum mohu pomoci B[3,2] # drsnaci mohou vyuzit toho, ze R-ko ma matici # ulozenou jako vektor poslepovanych sloupce, # tedy B[6] # Opet, dokud R-ku nerekneme jinak pocita po slozkach B + C B * C # Chceme-li maticovy soucin, pak B %*% C # matici transponujeme pomoci t(B) # inverze solve(B) # overime vypoctenou inverzni matici solve(B)%*%B # velice elegantne muzeme ziskat radkove prumery apply(B, 1, mean) # anebo sloupcove prumery apply(B, 2, mean) # druhy parametr tedy znaci index, pres ktery pouzivame # funkci "mean" ### editacia vytvorenych matic: B[2:3,1] <- 0; B[B > 1 | B == 0] <- Inf ### rozsirovanie matic print(D <- cbind(B,c(0,0,0),B)) ### dalsi zajimave funkce "eigen()", "diag()", "apply()". # 3. Praca s polom - aneb, kdybychom si nahodou nevystacili s maticema ### pozrite sa na funkciu "array()" pole <- array(1:24, c(3,2,4)) ### indexovanie pola... # 4. Praca s listom (zoznamom) ### datova struktura, ktorej prvky mozu mat rozny typ a roznu dlzku... l <- list(cislo1=15, cislo2 = c[1], vektor=a,logic=(b<7),znak="list") ### odkazovanie sa na jednotlive casti listu: list$cislo1, list$cislo2,... l$logic # 5. Praca s data frame ### specialny pripad listu (zoznamu), ktoreho prvky maju sice rozny typ, ### ale vzdy rovnaku dlzku... jmena <- c("Maruska", "Klara", "Eva"); datum_nar <- as.Date(c("1985-07-15", "1986-02-24", "1984-11-10")); vyska <- c(164, 170, 168); ZENY <-data.frame(jmena, datum_nar, vyska); ### spristupnenie prvkov data framu: analogicky ako list, alebo ### spristupnit nazvy prvkov pomocou "attach(data_frame)" ### Odpojenie data framu: pomocou "dettach(data_frame)" # Je na case si trochu pouklizet ls() # vypise vsechny promenne rm(jmena, datum_nar, vyska) # smaze vybrane promenne rm(list = ls()) # smaze vse - ve Windows se k tomu da i proklikat ########################################################### ##### Nahodne veliciny a ich rozdelenie ###### ########################################################### ### pozrite sa na generatory: "runif" a "rnorm", ktore generuju ### nahodny vyber z rovnomerneho a normalneho rozdelenia... ### pomocou helpu sa pozrite na funcie "plot()", "lines()" ### "points()", "hist()" a "boxplot()" X <- rnorm(1000) Y <- runif(1000) plot(X); # boxplot boxplot(X) # histogram hist(X, freq = TRUE, col="blue", main="Pokusny histogramek", ylab="Absolutni cetnost") # jak nastavit parametry kresleni obrazku -- viz. help(par) # moc prijemne cteni to ale neni... ########################################################### ##### PRACA S REALNYMI DATAMI ###### ########################################################### ### nacitajte data z txt suboru a pomenujte sledovane veliciny ### spravne nastavit cestu pomocou "getwd()" a "setwd()" ### na Windowsech se lze proklikat... DATA <- read.table("data.txt", header=F) # pokud bychom chteli mit nacteny spravne jednotlive typy promennych DATA <- read.table("data.txt", colClasses=c("factor", "factor", "factor", "numeric", "numeric", "numeric", "numeric"), header=F); names(DATA) <- c("index","skola","pohlavi","IQ","znamka1","znamka2","znamka3") # pro nacitani vetsich dat se muze hodit funkce "scan" # prvni pohled na data summary(DATA); dim(DATA); # skola ... typ skoly # znamka1 ... prum. znamka na pololetnim vysvedceni v 7.tride # znamka2 ... prum. znamka na konci roku v 7.tride # znamka3 ... prum. znamka na pololetnim vysvedceni v 8.tride ### Aky je rozdiel medzi nacitanim dat s parametrom "header = T" a "header = F" ### (pozri "help(read.table)" resp. "?read.table", alebo metoda POKUS-OMYL :-)) ### Skuste ulozit premennu data do RData suboru a opat nacitat pomocou "load()" save(DATA,file="data.RData") rm(list=ls()) load("data.RData") # abychom nemuseli psat DATA$IQ ale pouze IQ, # pozor, R-ko je case-sensitive attach(DATA) ### jednoducha analyza... # histogram hist(znamka1) # pocet sloupecku hlida parametr breaks. Mohu zadat bud # celkovy pocet sloupecku hist(znamka1, breaks = 50); # intervaly hist(znamka1, seq(1,4,0.25)); ### souvislost dvou velicin # pohlavi vs IQ # zakladni nahled... # 1 ... jsou kluci, 0 ... holky boxplot(IQ~pohlavi); # anebo :) boxplot(znamka1~pohlavi); # podobnou informaci nam dava take by(IQ, pohlavi, summary); by(znamka1, pohlavi, summary); # strukturu zkoumanych dat z hlediska skoly a pohlavi table(skola, pohlavi) ### kovariancna matica, korelacna matica... ### "help("var")", help("cor")... # Znamka asi bude souviset s IQ plot(znamka1~IQ); # tesnost tohoto vztahu se snazi zmerit korelacni koeficient # ten vystihuje tesnost linearniho vztahu cor(cbind(znamka1, IQ)) # pustime data.frame DATA detach(DATA); # # # # Ukonceni # q() # doporucuji na otazku odpovedet "yes" # a pak se vam do souboru ".RData" ulozi vsechna data # a do souboru ".RHistory" historie prikaze # pokud bych si chtel historii prikazu ulozit nekam jinak, # tak savehistory(file = "cviceni.RData") # # # Dodatek -- R & Unix # R-ko vznikalo pod Unixem # R prejima nektere vlastnosti bashe, napr. # Tabulator # Ctrl + D # prikazem system("prikaz") lze provadet prikazy v bashi # system("ps -aux"); # rafinovana sebevrazda -- system("killall R")