2 Premenné a dátové štruktúry

V tejto kapitole postupneme pokračujeme v spoznávaní Rka. Pozrieme sa na bežne používané objekty s ktorými budeme pracovať, či už premenné dátové štruktúry alebo iné užitočné funkcie.

2.1 Typy premenných

2.1.1 numeric

Objekt tohoto typu číslo. Môžeme prealokovať pamäť a vytvoriť objekt typu numeric. Štandardne bude tento objekt nula alebo vektor núl.

# create a vector of length 5 of type numeric
x <- numeric(5)
# it will be filled with zeros

Ďalej sa môžeme opýtať či je daný objekt typu numeric pomocou is.numeric() Ak nie je, tak môžeme skonvertovať do numeric typu pomocou as.numeric(), pokiaľ sa to dá.

is.numeric(x)
## [1] TRUE
y <- TRUE
is.numeric(y)
## [1] FALSE
z <- as.numeric(y)
is.numeric(z)
## [1] TRUE

2.1.2 character

Slová/texty sú typu character. Podobne ako pri iných typoch premenných, môžeme použiť funkcie character(), is.character() a as.character() na vytvorenie, overenie alebo konvertovanie.

f <- "Hello"
is.character(f)
## [1] TRUE

2.1.3 logical

Logická (boolovská) premenná nadobúda hodnoty TRUE alebo FALSE. Akonáhle urobíme s logickou premennou nejakú aritmetickú operáciu, Rko ju automaticky skonvertuje na číselnú (numeric).

2+2 > 5
## [1] FALSE
10+(2+2 > 5)
## [1] 10

Logické premenné sú tiež doležité na skúmanie podmnožín

height <- c(1.75, 1.80, 1.65, 1.90, 1.74, 1.91)
height > 1.70
## [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
ind <- (height > 1.75)
height[ind]
## [1] 1.80 1.90 1.91

Funkcia which() vráti indexy súradníc vektora typu logical, ktoré nadobúdajú hodnoty TRUE. Na 0-1 vektor typu numeric nefunguje.

which(height > 1.70)
## [1] 1 2 4 5 6

2.1.4 factor

Faktorová premenná (factor) je užitočná na prácu s informáciami, ktoré sú v nenumerickom tvare. Môžeme mať usporiadané faktory (silne nesúhlasím, nesúhlasím, nemám názor, súhlasím, silne súhlasím.) alebo neusporiadané faktory (modrá, žltá, zelená…).

carColors <- c("red","red","blue","yellow","salmon","white","grapefruit","white","black")
fcarColors <- as.factor(carColors)
fcarColors
## [1] red        red        blue       yellow     salmon     white      grapefruit
## [8] white      black     
## Levels: black blue grapefruit red salmon white yellow
pain <- c(0,3,2,2,1)
fpain <- factor(pain,levels=0:3, ordered = TRUE)
levels(fpain) <- c("none","mild","medium","severe")
fpain
## [1] none   severe medium medium mild  
## Levels: none < mild < medium < severe

2.1.5 Iné

Existujú všelijaké iné typy premenných, napríklad complex pre komplexné čísla, integer pre celé čísla alebo napríklad date pre dátumy.

2.2 Typy dátových štruktúr

2.2.1 vector

Vektor je skupina objektov rovnakého typu. Nemusí nutne ísť len o čísla.

2.2.2 matrix

Matica je tabuľka objektov rovnakého typu.

2.2.3 array

Pole je skupina objektov rovnakého typu, môže mať aj viac ako 2 dimenzie.

2.2.4 list

Zoznam sa používa na objekty, ktoré sú rôzneho typu.

2.2.5 data.frame

Dátová tabuľka je jedným zo základných objektov, ktoré používa ako vstup mnoho súčastí R. Na rozdiel od matice môže mať viacej typov dát. Dátová tabuľka je v podstate špeciálnym typom zoznamu, kde komponenty musia byť vektory.

Nasledujúce užitočné funkcie umožňujú efektívnu prácu s objektom typu data.frame.

  • head() - vypíše hlavičku tabuľky, takže prvých 6 riadkov
  • tail() - vypíše koniec tabuľky, takže posledných 6 riadkov
  • dim() - dimenzie tabuľky
  • nrow() - počet riadkov
  • ncol() - počet stĺpcov
  • names() - mená vektorov, ktoré tvoria dátovú tabuľku
  • sapply(df,class) - funkcia, ktorá vypíše typ jednotlivých vektorov v rámci daného data.frame s názvom df

2.3 Vlastné funkcie

Funkcia.

Obrázok 2.1: Funkcia.

Zadefinujeme si funkciu nasledovne.

myfunction <- function(a, b, c=5){
  x <- a+b
  return(x*c)
}

Čo bude výsledkom myFunction(2,3) a myFunction(2,3,4) ?

2.4 for cyklus

Nasledujúci kód sčíta všetky čísla od 1 po 1000

x <- 0
for(iNumber in 1:1000) {
  x <- x + iNumber
}
x
## [1] 500500

Index iNumber prechádza, cez všetky čísla vo vektore 1:1000 a vykoná všetky operácie, ktoré sú v kučeravých zátvorkách.

Podobne môžeme prechádzať cez vektor iných objektov ako je číslo. Tu budeme prechádzať cez vektor textov.

persons <- c("Martin", "Elena", "Chryzogóm", "Lucia")
for(iPerson in persons) {
  print(iPerson)
}
## [1] "Martin"
## [1] "Elena"
## [1] "Chryzogóm"
## [1] "Lucia"

Rovnaký výstup dostaneme, ak budeme prechádzať cez indexy.

persons <- c("Martin", "Elena", "Chryzogóm", "Lucia")
for(iNumber in 1:4) {
  print(persons[iNumber])
}
## [1] "Martin"
## [1] "Elena"
## [1] "Chryzogóm"
## [1] "Lucia"

2.5 Knižnice

Knižnice (libraries) sú kolekciou rôznych funkcií. Niektoré knižnice sú vytvorené priamo tvorcami R, ako napríklad base, iné nadšencami, ako napríklad causalweight. Ak chceme používať príkazy z nejakej knižnice, musíme ju mať nainštalovanú a musíme ju zavolať. Napríklad populárna knižnica ggplot2 slúži na tvorbu vizualizácií. Najprv musíte spustiť príkaz install.packages("ggplot2") a z online repozitára sa stiahne táto knižnica na Váš počítač.

library(ggplot2)
ggplot(diamonds) + geom_point(aes(x=carat, y=price, color=cut))

Ak do konzoly napíšeme ?ggplot ukáže sa nám podrobná dokumentácia. Väčšina knižníc má svoju vignette, kde je nárornou formou stručne vysvetlená základná funkcionalita danej knižnice.

2.6 Štandardy

“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread.”

— Hadley Wickham

Je dobrou praxou písať pekný kód. Čo to znamená? Napríklad:

  • loadData.R - názov funkcie alebo skriptu - veľké písmeno na začiatku ďalšieho slova. Alebo load_data.R
  • <- - priradenie. Používajte namiesto =
  • Nie je dobré písať príliš dlhé riadky.
  • getConvReel_11 - dávajte zrozumiteľné názvy funkciám
  • vyvarujte sa dvojitím záporom, sú nezrozumiteľné
  • okolo = , +, -, <- nechávajte medzeru, nech sa to lepšie číta
  • píšte veľa komentárov (#najlepsie bez makcenov a dlznov) a odsadzujte slová
  • píšte kód tak, aby ho vedel čítať niekto po vás s minimálnou námahou

Mnoho odporúčaní je tu: https://style.tidyverse.org a tu: https://google.github.io/styleguide/Rguide.html

2.7 Časté chyby

  • Neporiadok v kóde - čítať neporiadny kód je bolesť. Niekedy je aj vlastný kód po pár mesiacoch úplne nečitateľný. Špeciálna bolesť je čítat cudzí neporiadny kód.
  • (0.1 + 0.2) == 0.3 - treba si dávať pozor na to, ako počítač reprezentuje čísla.
  • zlé ozátvorkovanie - viacej zátvoriek je skoro vždy lepšie. Keď sa neviete rozhodnúť č’i pridať zátvorku, pridajte ju. Sú lacné.
  • chýbajúca knižnica - je dobrou praxou na začiatku programu inicializovať všetky knižnice, ktoré sú potrebné na spustenie.
  • nekompatibilné objekty - veľmi často sa robia operácie s nekompatibilnými objektami. Pokiaľ Rko neviem automaticky skonvertovať objekty na kompatibilné, tak vyhlási chybu. Niekedy je však horšie keď chybu ani nevyhlási, niečo urobí a chyba sa môže ukázať na úplne inom mieste.

2.8 Demonštrácia v R

Na začiatku musíme načítať knižnice, ktoré budeme potrebovať. Nejaké môžeme načítať aj neskôr,

#This package contains the datasets used in ISwR book
library(ISwR)

#load the package "survival"
#you may need to install it first
#install.packages("survival")
library(survival)

Do premennej pridáme hodnotu použitím ->. Rko automaticky vyhodnotí o aký objekt ide. Objekt f bude typu numeric a objekt g bude typu character.

f <- 14
g <- "seven"

Môžeme sa mechanicky pozrieť, ktoré premenné máme v pamäti (funkcia ls()). Vymazať všetko v pamäti môžeme pomocou rm(list=ls()).

#list all the variables in the memory
ls()
##  [1] "carColors"  "f"          "fcarColors" "fpain"      "g"         
##  [6] "height"     "ind"        "iNumber"    "iPerson"    "myfunction"
## [11] "pain"       "persons"    "x"          "y"          "z"

Ak chceme pridať všetky premenné z nejakej dátovej tabuľky, použijeme attach().

# thuesen is a name of a dataset in the ISwR package
# it is not in the global environment
thuesen
##    blood.glucose short.velocity
## 1           15.3           1.76
## 2           10.8           1.34
## 3            8.1           1.27
## 4           19.5           1.47
## 5            7.2           1.27
## 6            5.3           1.49
## 7            9.3           1.31
## 8           11.1           1.09
## 9            7.5           1.18
## 10          12.2           1.22
## 11           6.7           1.25
## 12           5.2           1.19
## 13          19.0           1.95
## 14          15.1           1.28
## 15           6.7           1.52
## 16           8.6             NA
## 17           4.2           1.12
## 18          10.3           1.37
## 19          12.5           1.19
## 20          16.1           1.05
## 21          13.3           1.32
## 22           4.9           1.03
## 23           8.8           1.12
## 24           9.5           1.70
#it has to be called like this
thuesen$blood.glucose
##  [1] 15.3 10.8  8.1 19.5  7.2  5.3  9.3 11.1  7.5 12.2  6.7  5.2 19.0 15.1  6.7
## [16]  8.6  4.2 10.3 12.5 16.1 13.3  4.9  8.8  9.5
#attach the whole dataset
attach(thuesen)
#and access is directly
blood.glucose
##  [1] 15.3 10.8  8.1 19.5  7.2  5.3  9.3 11.1  7.5 12.2  6.7  5.2 19.0 15.1  6.7
## [16]  8.6  4.2 10.3 12.5 16.1 13.3  4.9  8.8  9.5

Takýmto spôsobom zadefinujeme novú funkciu.

myfunction <- function(a, b, c=5){ 
  return(a*b*c)
}

myfunction(1,2,4)
## [1] 8
myfunction(1,2)
## [1] 10

Funkcie môžeme mať v rámci skriptu alebo ako separátne súbory typu subor.R. Pomocou setwd() nastavíme working directory. Ak chcete vedieť v ktorom adresári ste, použite getwd().

setwd("/Users/lukaslaffers/Dropbox/pravdepodobnost a statistika 2/ISwR/scripts")

source("myfunction2.R")
myfunction2(1,2,4)

Tu sú rôzne spôsoby ako vykresiť závislosť dvoch premenných. Funkcia with(table,fun) vyhodnotí fun na dátovej tabuľke table.

attach(thuesen)
## The following objects are masked from thuesen (pos = 3):
## 
##     blood.glucose, short.velocity
plot(blood.glucose, short.velocity)

plot(thuesen$blood.glucose, thuesen$short.velocity)

with(thuesen, plot(blood.glucose, short.velocity))

subset umožnuje vytvoriť podmnožinu dátovej tabuľky.

#choose a subset
thue2 <- subset(thuesen,blood.glucose<7)
thue2
##    blood.glucose short.velocity
## 6            5.3           1.49
## 11           6.7           1.25
## 12           5.2           1.19
## 15           6.7           1.52
## 17           4.2           1.12
## 22           4.9           1.03

Pomocou setwd() vieme pridať ďalšiu premennú do dátovej tabuľky, napríklad transformovaním existujúcich premenných.

thue3 <- transform(thuesen,log.gluc=log(blood.glucose))
thue3
##    blood.glucose short.velocity log.gluc
## 1           15.3           1.76 2.727853
## 2           10.8           1.34 2.379546
## 3            8.1           1.27 2.091864
## 4           19.5           1.47 2.970414
## 5            7.2           1.27 1.974081
## 6            5.3           1.49 1.667707
## 7            9.3           1.31 2.230014
## 8           11.1           1.09 2.406945
## 9            7.5           1.18 2.014903
## 10          12.2           1.22 2.501436
## 11           6.7           1.25 1.902108
## 12           5.2           1.19 1.648659
## 13          19.0           1.95 2.944439
## 14          15.1           1.28 2.714695
## 15           6.7           1.52 1.902108
## 16           8.6             NA 2.151762
## 17           4.2           1.12 1.435085
## 18          10.3           1.37 2.332144
## 19          12.5           1.19 2.525729
## 20          16.1           1.05 2.778819
## 21          13.3           1.32 2.587764
## 22           4.9           1.03 1.589235
## 23           8.8           1.12 2.174752
## 24           9.5           1.70 2.251292
thue2$log.gluc <- log(thue2$blood.glucose)

Podobne within() modifikuje dátovú tabuľku (narozdiel of with(), ktorá len vytvorí nový objekt).

thue4 <- within(thuesen,{
  log.gluc <- log(blood.glucose)
  m <- mean(log.gluc)
  centered.log.gluc <- log.gluc - m
  rm(m)
})

thue4
##    blood.glucose short.velocity centered.log.gluc log.gluc
## 1           15.3           1.76       0.481879807 2.727853
## 2           10.8           1.34       0.133573113 2.379546
## 3            8.1           1.27      -0.154108960 2.091864
## 4           19.5           1.47       0.724441444 2.970414
## 5            7.2           1.27      -0.271891996 1.974081
## 6            5.3           1.49      -0.578266201 1.667707
## 7            9.3           1.31      -0.015958621 2.230014
## 8           11.1           1.09       0.160972087 2.406945
## 9            7.5           1.18      -0.231070001 2.014903
## 10          12.2           1.22       0.255462930 2.501436
## 11           6.7           1.25      -0.343865495 1.902108
## 12           5.2           1.19      -0.597314396 1.648659
## 13          19.0           1.95       0.698465958 2.944439
## 14          15.1           1.28       0.468721722 2.714695
## 15           6.7           1.52      -0.343865495 1.902108
## 16           8.6             NA      -0.094210818 2.151762
## 17           4.2           1.12      -0.810888496 1.435085
## 18          10.3           1.37       0.086170874 2.332144
## 19          12.5           1.19       0.279755623 2.525729
## 20          16.1           1.05       0.532846250 2.778819
## 21          13.3           1.32       0.341791014 2.587764
## 22           4.9           1.03      -0.656737817 1.589235
## 23           8.8           1.12      -0.071221300 2.174752
## 24           9.5           1.70       0.005318777 2.251292

Pri generovaní náhodných čísel (runif() generuje náhodné čísla rovnomerne medzi 0 a 1) je dobrým zvykom nastaviť seed generátora (pseudo)náhodných čísel. Takýmto spôsobom dostaneme všetci úplne totožné výsledky.

#plotting
set.seed(98453)
x <- runif(50,0,2)
y <- runif(50,0,2)

Nakreslíme a modifikujeme graf. Tu vidíme, že vyskúšaním hneď pochopíte, čo daná funkcia robí bez toho, aby ste čítali dokumentáciu.

plot(x, y, main="Titulok", sub="subtitle",
     xlab="x-label", ylab="y-label")
text(0.6,0.6,"text at (0.6,0.6)")
abline(h=.6,v=.6)

for (side in 1:4){ 
  mtext(-1:4,side=side,at=.7,line=-1:4)
}

mtext(paste("side",1:4), side=1:4, line=-1,font=2)

Podobne tu.

#empty figure
plot(x, y, type="n", xlab="", ylab="", axes=F)
#add elements one by one
#points
points(x,y)
axis(1)
axis(2,at=seq(0.2,1.8,0.2))
box()
title(main="Main title", sub="subtitle",
      xlab="x-label", ylab="y-label")

Tu sú rôzne varianty zobrazenia distribúcie

#in order to reproduce the graph exactly
# we need to fix the seed of the random number generator
set.seed(1234) #make it happen....
x <- rnorm(100000)

hist(x)

hist(x,freq=F)
curve(dnorm(x),add=T)

h <- hist(x, plot=F)
ylim <- range(0, h$density, dnorm(0))
hist(x, freq=F, ylim=ylim)
curve(dnorm(x), add=T)  

hist.with.normal <- function(x, xlab=deparse(substitute(x)),...)
{
  h <- hist(x, plot=F, ...)
  s <- sd(x)
  m <- mean(x)
  ylim <- range(0,h$density,dnorm(0,sd=s))
  hist(x, freq=F, ylim=ylim, xlab=xlab, ...)
  curve(dnorm(x,m,s), add=T)
}

a <- rnorm(100000)
hist.with.normal(a)

Naćítanie dát z tabuľky je zvyčajne prvým krokom akejkoľvek analýzy. Dáta prichádzajú v rôznych formách. Tu je zopár príkladov ako načítať dáta z rôznych typov súborov. Dôležité je, aby v adresári v ktorom sa nachádzame daný súbor aj naozaj bol.

######################################
#This part is not taken from ISwR book
######################################

#There are many different ways how can we load data to R
# and many different formats of the data
# Here we cover some of them:

# xlsx
# csv
# dat
# txt

# remember to set the current directory using setwd()
# You may check it using this command
getwd()
## [1] "/Users/lukaslaffers/Library/CloudStorage/Dropbox/pravdepodobnost a statistika 2/PaS2bookdown"
library(readxl)
#you may need to install it first
#install.packages("survival")

Na otvorenie typu xlsx potrebujeme načítať novú knižnicu. Sú rôzne knižnice, ktoré toto vedia.

#working with datasets
data_card <- read_xlsx("card.xlsx")
# Data downloaded from https://davidcard.berkeley.edu/data_sets.html
# from paper: 
# "Using Geographic Variation in College Proximity to Estimate the Return to Schooling". 
#   In L.N. Christofides, E.K. Grant, and R. Swidinsky, editors, Aspects of Labor Market 
#   Behaviour: Essays in Honour of John Vanderkamp. Toronto: University of Toronto Press, 1995.
# Data also here: https://docs.google.com/spreadsheets/d/116KwP9SJUQ8LZHeIH-sTvlFFwCgkKIsz86exk1I7O1s/edit#gid=943363882

CSV súbor je častokrát preferovaný, lebo jeho forma nezávisí na verzii MS Excel.

#use read.csv to load comma-separated-value file
data_csv <- read.csv("card.csv")

Ďalších častým formátom je .dat.

#we may save the dataset to a ".dat"
save(data_card, file="card.dat")
#then load it using load
load("card.dat")

Natívne podporovaný formát je .RData.

#we may save the dataset to a ".RData"
save(data_card, file="card.RData")
#then load it using load
load("card.RData")

Bežným je tiež .txt formát.

#use read.table to load a txt file
data_txt <- read.table("card.txt")

Súbor, ktorý sťahujeme môže byť aj na internete.

#sometime the dataset is on the internet
data_card <- read.table("https://lukas-laffers.squarespace.com/s/card.txt")

Alebo v nejakej konkrétnej Rkovej knižnici.

#dataset may be already in some R-package
data(malaria, package="ISwR")

Vždy sa pozeráme na sumár datasetu. Ten nás informuje o formátoch a charakteristikách jednotlivých premenných.

#look at the dataset
summary(data_card)
##        id           nearc2           nearc4          nearc4a      
##  Min.   :   2   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:1330   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :2574   Median :0.0000   Median :1.0000   Median :0.0000  
##  Mean   :2610   Mean   :0.4318   Mean   :0.6781   Mean   :0.4921  
##  3rd Qu.:3908   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
##  Max.   :5225   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##     nearc4b           ed76            ed66           age76      
##  Min.   :0.000   Min.   : 0.00   Min.   : 0.00   Min.   :24.00  
##  1st Qu.:0.000   1st Qu.:12.00   1st Qu.: 9.00   1st Qu.:25.00  
##  Median :0.000   Median :13.00   Median :11.00   Median :28.00  
##  Mean   :0.186   Mean   :13.23   Mean   :10.74   Mean   :28.18  
##  3rd Qu.:0.000   3rd Qu.:16.00   3rd Qu.:12.00   3rd Qu.:31.00  
##  Max.   :1.000   Max.   :18.00   Max.   :18.00   Max.   :34.00  
##      daded          nodaded           momed          nomomed      
##  Min.   : 0.00   Min.   :0.0000   Min.   : 0.00   Min.   :0.0000  
##  1st Qu.: 8.00   1st Qu.:0.0000   1st Qu.: 8.00   1st Qu.:0.0000  
##  Median : 9.94   Median :0.0000   Median :11.00   Median :0.0000  
##  Mean   :10.00   Mean   :0.2242   Mean   :10.34   Mean   :0.1143  
##  3rd Qu.:12.00   3rd Qu.:0.0000   3rd Qu.:12.00   3rd Qu.:0.0000  
##  Max.   :18.00   Max.   :1.0000   Max.   :18.00   Max.   :1.0000  
##      weight           momdad14         sinmom14          step14       
##  Min.   :  75607   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.: 123030   1st Qu.:1.0000   1st Qu.:0.0000   1st Qu.:0.00000  
##  Median : 365200   Median :1.0000   Median :0.0000   Median :0.00000  
##  Mean   : 320318   Mean   :0.7921   Mean   :0.1002   Mean   :0.03847  
##  3rd Qu.: 405452   3rd Qu.:1.0000   3rd Qu.:0.0000   3rd Qu.:0.00000  
##  Max.   :1752340   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000  
##      reg661            reg662          reg663          reg664       
##  Min.   :0.00000   Min.   :0.000   Min.   :0.000   Min.   :0.00000  
##  1st Qu.:0.00000   1st Qu.:0.000   1st Qu.:0.000   1st Qu.:0.00000  
##  Median :0.00000   Median :0.000   Median :0.000   Median :0.00000  
##  Mean   :0.04456   Mean   :0.155   Mean   :0.194   Mean   :0.06919  
##  3rd Qu.:0.00000   3rd Qu.:0.000   3rd Qu.:0.000   3rd Qu.:0.00000  
##  Max.   :1.00000   Max.   :1.000   Max.   :1.000   Max.   :1.00000  
##      reg665           reg666          reg667           reg668     
##  Min.   :0.0000   Min.   :0.000   Min.   :0.0000   Min.   :0.000  
##  1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:0.0000   1st Qu.:0.000  
##  Median :0.0000   Median :0.000   Median :0.0000   Median :0.000  
##  Mean   :0.2095   Mean   :0.093   Mean   :0.1102   Mean   :0.031  
##  3rd Qu.:0.0000   3rd Qu.:0.000   3rd Qu.:0.0000   3rd Qu.:0.000  
##  Max.   :1.0000   Max.   :1.000   Max.   :1.0000   Max.   :1.000  
##      reg669           south66           work76          work78      
##  Min.   :0.00000   Min.   :0.0000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.00000   Median :0.0000   Median :1.000   Median :1.0000  
##  Mean   :0.09355   Mean   :0.4127   Mean   :0.835   Mean   :0.7351  
##  3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:1.000   3rd Qu.:1.0000  
##  Max.   :1.00000   Max.   :1.0000   Max.   :1.000   Max.   :1.0000  
##    lwage76            lwage78              famed           black     
##  Length:3613        Length:3613        Min.   :1.000   Min.   :0.00  
##  Class :character   Class :character   1st Qu.:3.000   1st Qu.:0.00  
##  Mode  :character   Mode  :character   Median :6.000   Median :0.00  
##                                        Mean   :5.913   Mean   :0.23  
##                                        3rd Qu.:8.000   3rd Qu.:0.00  
##                                        Max.   :9.000   Max.   :1.00  
##     smsa76r         smsa78r              reg76r          reg78r         
##  Min.   :0.0000   Length:3613        Min.   :0.0000   Length:3613       
##  1st Qu.:0.0000   Class :character   1st Qu.:0.0000   Class :character  
##  Median :1.0000   Mode  :character   Median :0.0000   Mode  :character  
##  Mean   :0.6947                      Mean   :0.3997                     
##  3rd Qu.:1.0000                      3rd Qu.:1.0000                     
##  Max.   :1.0000                      Max.   :1.0000                     
##     reg80r             smsa66r          wage76             wage78         
##  Length:3613        Min.   :0.0000   Length:3613        Length:3613       
##  Class :character   1st Qu.:0.0000   Class :character   Class :character  
##  Mode  :character   Median :1.0000   Mode  :character   Mode  :character  
##                     Mean   :0.6427                                        
##                     3rd Qu.:1.0000                                        
##                     Max.   :1.0000                                        
##     wage80             noint78           noint80          enroll76      
##  Length:3613        Min.   :0.00000   Min.   :0.0000   Min.   :0.00000  
##  Class :character   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000  
##  Mode  :character   Median :0.00000   Median :0.0000   Median :0.00000  
##                     Mean   :0.08137   Mean   :0.1068   Mean   :0.09466  
##                     3rd Qu.:0.00000   3rd Qu.:0.0000   3rd Qu.:0.00000  
##                     Max.   :1.00000   Max.   :1.0000   Max.   :1.00000  
##    enroll78           enroll80             kww                 iq           
##  Length:3613        Length:3613        Length:3613        Length:3613       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    marsta76           marsta78           marsta80           libcrd14        
##  Length:3613        Length:3613        Length:3613        Length:3613       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
## 

Vśimneme si, že premenná je typu faktor.

#IQ is apparently not a text
data_card$iq[1:5]
## [1] "."   "93"  "103" "88"  "108"

Vieme ju skonvertovať na numerickú premennú tak, že ju najprv skonvertujeme na text.

#we may recode it
data_card$iqn <- as.numeric(as.character(data_card$iq))
## Warning: NAs introduced by coercion
data_card$wage78n <- as.numeric(as.character(data_card$wage78))
## Warning: NAs introduced by coercion

A nakresliť.

#look at the association of IQ and wages
with(data_card,plot(iqn,wage78n))

Rovnako nakreslíme závislosť IQ a mzdy pre tých, ktorý zarábajú menej ako 2000.

library(tidyverse)
#zoom for those who earned less than 2000
with(data_card %>% filter(wage78n<2000),plot(iqn,wage78n))

Kreslenie obrázkov a vizualizácia je zaujímavá kapitola sama o sebe.

#or more fancy graph
ggplot(data=data_card %>% filter(wage78n<2000), aes(x = iqn, y = wage78n)) +
  geom_point() +
  geom_smooth(method="lm", formula = y ~ x) +
  geom_smooth(method="lm", formula = y ~ x + I(x^2), col="red")
## Warning: Removed 817 rows containing non-finite values (`stat_smooth()`).
## Removed 817 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 817 rows containing missing values (`geom_point()`).

R súbor z prednášky

2.9 Cvičenia

Cvičenie 2.1 Vráťme sa k príkladu

height <- c(1.75, 1.80, 1.65, 1.90, 1.74, 1.91)
ind1 <- (height > 1.75)
ind2 <- 1*ind1

Podrobne vysvetlite, prečo height[ind1] a height[ind2] nedáva ten istý výstup.

Cvičenie 2.2 Viete vysvetliť tento zdanlivý paradox?

(0.1 + 0.2) == 0.3
## [1] FALSE

Cvičenie 2.3 Poďme naspäť k cvičeniu 1.3 o filmoch.

Aký je rozpočet akčných filmov, vydaných po 1995?

Tu je pomôcka. Sú tu 4 rôzne spôsoby ako sa to dá robiť. Líšia sa najmä prehľadnosťou zápisu. Prehľadnejší kód znamená menší priestor pre chyby.

Spôsob 1. Indexovaním. Indexy si uchovávame:

#option 1
ind <- movies$year > 1995 & movies$Action==1
#look at column called "budget"
movies[ind,"budget"]
#or 
# "budget" is in the 4th column
names(movies)
#look at the fourth column
movies[ind,4]

Spôsob 2. Priamo indexovaním.

#option 2 directly (less readable)
movies[movies$year > 1995 & movies$Action==1,"budget"]
movies[movies$year > 1995 & movies$Action==1,4]

Spôsob 3. Pomocou funkcie with().

#option 3 nicer
# use function with, takes dataset as the first argument
with(movies, budget[year > 1995 & Action==1])

Spôsob 4. Pomocou knižnice dplyr

#option 4 much nicer (use dplyr package)
movies %>% 
  filter(year > 1995, Action==1) %>%
  select(budget)

Všimnite si, že posledný kód je oveľa čitateľnejší.

Teraz splňte nasledovnú úlohu:

Usporiadajte animované filmy s viac ako 1000 hodnoteniami, vydané po roku 1980, ktoré trvajú dlhšie ako 30 minút podľa hodnotenia od najlepšieho po najhorší.

(Možno použiť funkcie filter(), arrange() a desc().)

Cvičenie 2.4 Vytvorte funkciu s menom bmi, ktorá dostane ako vstup výšku v cm a váhu v kg a jej výstupom bude BMI. Môžete uvažovať, že vstupy sú korektne zadané.

Cvičenie 2.5 Pomocou for cyklu zrátajte

\[\begin{equation*} \sum_{i=1}^{350}\frac{i(i-1)}{i+2} \end{equation*}\]

a

\[\begin{equation*} \prod_{i=1}^{350}\frac{i+1}{i+2} \end{equation*}\]

Cvičenie 2.6 Stiahnite si a načítajte dáta o kvalite červených vín. stadiaľto. Porozmýšľajte ako sú rôzne atribúty červeného vína asociované s jeho kvalitou (quality).

Cvičenie 2.7 Stiahnite si a načítajte dáta o výkone študentov na rôznych testoch. stadiaľto. Porozmýšľajte ako je vzdelanie rodičov asociované s akademickým výkonom v rôznych oblastiach (math.score, reading.score, writing.score).