MAI061 cvičení 1

Z ωικι.matfyz.cz
Přejít na: navigace, hledání
# 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")