<pre>
# 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")
</pre>