RAD SA PODATCIMA: DODATNI KONCEPTI

Hrvatski studiji

dr.sc. Luka Šikić

28 listopad, 2019

CILJEVI PREDAVANJA

TABULACIJA

rm(list = ls()) # očisti radni prostor
library(lsr) # Učitaj paket
load(file.path("nightgarden.Rdata")) # Uvezi podatke
who() # Pregledaj radni prostor
##    -- Name --   -- Class --   -- Size --
##    speaker      character     10        
##    utterance    character     10
print( speaker ) # Pogledaj podatke
##  [1] "upsy-daisy"  "upsy-daisy"  "upsy-daisy"  "upsy-daisy"  "tombliboo"  
##  [6] "tombliboo"   "makka-pakka" "makka-pakka" "makka-pakka" "makka-pakka"
print( utterance ) # Pogledaj podatke
##  [1] "pip" "pip" "onk" "onk" "ee"  "oo"  "pip" "pip" "onk" "onk"
table(speaker) # Tabuliraj jednu varijablu
## speaker
## makka-pakka   tombliboo  upsy-daisy 
##           4           2           4
table(utterance) # Tabuliraj drugu varijablu
## utterance
##  ee onk  oo pip 
##   1   4   1   4
table(speaker, utterance) # Tabuliraj obje varijable
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2
# Formiraj podatkovni okvir (`data.frame()`)
df_tab <- data.frame(speaker, utterance)
df_tab # Pogledaj df
##        speaker utterance
## 1   upsy-daisy       pip
## 2   upsy-daisy       pip
## 3   upsy-daisy       onk
## 4   upsy-daisy       onk
## 5    tombliboo        ee
## 6    tombliboo        oo
## 7  makka-pakka       pip
## 8  makka-pakka       pip
## 9  makka-pakka       onk
## 10 makka-pakka       onk
table(df_tab) # Tabuliraj df
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2
xtabs( formula = ~ speaker + utterance, data = df_tab) # Drugi način
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2
itng_table <- table(df_tab)  # Napravi tablicu, pripiši varijabli
itng_table   # Pogledaj tablicu
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2
# Napravi tablicu proporcija po redovima
prop.table( x = itng_table, margin = 1)
##              utterance
## speaker        ee onk  oo pip
##   makka-pakka 0.0 0.5 0.0 0.5
##   tombliboo   0.5 0.0 0.5 0.0
##   upsy-daisy  0.0 0.5 0.0 0.5
# Napravi tablicu proporcija po kolonama
prop.table( x = itng_table, margin = 2)
##              utterance
## speaker        ee onk  oo pip
##   makka-pakka 0.0 0.5 0.0 0.5
##   tombliboo   1.0 0.0 1.0 0.0
##   upsy-daisy  0.0 0.5 0.0 0.5

TRANSFORMACIJA PODATAKA

# Početni podatkovni skup
load(file.path("./likert.Rdata")) # Učitaj
likert.raw # Pogledaj podatke
##  [1] 1 7 3 4 4 4 2 6 5 5
# Prva transformacija
centrirana_serija <- likert.raw -4
centrirana_serija # Pogledaj podatke
##  [1] -3  3 -1  0  0  0 -2  2  1  1
# Druga transformacija
apsolutna_serija <- abs( centrirana_serija )
apsolutna_serija  # Pogledaj podatke
##  [1] 3 3 1 0 0 0 2 2 1 1
# Treća transformacija
smjer_serija <- sign( centrirana_serija )
smjer_serija      # Pogledaj podatke
##  [1] -1  1 -1  0  0  0 -1  1  1  1
# Poveži sve transformacije u podatkovni okvir
df_likert <- data.frame( likert.raw )               # Stvori data frame
df_likert$centrirano <- df_likert$likert.raw - 4    # Centriraj
df_likert$apsolutno <- abs( df_likert$centrirano )  # Apsolutno
df_likert$smjer <- sign( df_likert$centrirano )     # Smjer
df_likert                                           # Pogledaj podatke
##    likert.raw centrirano apsolutno smjer
## 1           1         -3         3    -1
## 2           7          3         3     1
## 3           3         -1         1    -1
## 4           4          0         0     0
## 5           4          0         0     0
## 6           4          0         0     0
## 7           2         -2         2    -1
## 8           6          2         2     1
## 9           5          1         1     1
## 10          5          1         1     1
# Stvori podatke
godine <- c( 60,58,24,26,34,42,31,30,33,2,9 )
# Napravi intervalni vektor
intervali_godine <- seq( from = 0, to = 60, by = 20 )
intervali_godine # Pogledaj
## [1]  0 20 40 60
# Napravi vektor naziva
nazivi_godine <- c( "mlado", "odraslo", "staro" )
nazivi_godine
## [1] "mlado"   "odraslo" "staro"
# Napravi intervalni vektor
godine_intervali_nazivi <- cut (x = godine,
                                breaks = intervali_godine,
                                labels = nazivi_godine)
godine_intervali_nazivi # Pogledaj podatke (faktor!)
##  [1] staro   staro   odraslo odraslo odraslo staro   odraslo odraslo
##  [9] odraslo mlado   mlado  
## Levels: mlado odraslo staro
table(godine_intervali_nazivi) # Tabuliraj
## godine_intervali_nazivi
##   mlado odraslo   staro 
##       2       6       3
# Napravi podatkovni okvir
data.frame(godine, godine_intervali_nazivi)
##    godine godine_intervali_nazivi
## 1      60                   staro
## 2      58                   staro
## 3      24                 odraslo
## 4      26                 odraslo
## 5      34                 odraslo
## 6      42                   staro
## 7      31                 odraslo
## 8      30                 odraslo
## 9      33                 odraslo
## 10      2                   mlado
## 11      9                   mlado

IZVLAČENJE PODSKUPOVA PODATAKA

is.MP <- speaker == "makka-pakka" # Logički subset
is.MP # Pogledaj
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
# Dodatne mogućnosti
utterance[ is.MP ] 
## [1] "pip" "pip" "onk" "onk"
# Kraći način
utterance[ speaker == "makka-pakka" ]
## [1] "pip" "pip" "onk" "onk"
# Napredniji načini
# Izvuci logičke tvrdnje za "pip" i "oo"
utterance %in% c("pip","oo") 
##  [1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
# Indeksiraj speaker prema varijablama iz utterance
speaker[ utterance %in% c("pip","oo") ]
## [1] "upsy-daisy"  "upsy-daisy"  "tombliboo"   "makka-pakka" "makka-pakka"
utterance[2:3] # Pogledaj raspon
## [1] "pip" "onk"
utterance[-(2:3)] # Obriši raspon
## [1] "pip" "onk" "ee"  "oo"  "pip" "pip" "onk" "onk"
#  Podjela vektora na grupe
govor_chr <- split( x = utterance, f = speaker) # Podijeli
govor_chr # Pogledaj
## $`makka-pakka`
## [1] "pip" "pip" "onk" "onk"
## 
## $tombliboo
## [1] "ee" "oo"
## 
## $`upsy-daisy`
## [1] "pip" "pip" "onk" "onk"
df_tab # Pogledaj podatke
##        speaker utterance
## 1   upsy-daisy       pip
## 2   upsy-daisy       pip
## 3   upsy-daisy       onk
## 4   upsy-daisy       onk
## 5    tombliboo        ee
## 6    tombliboo        oo
## 7  makka-pakka       pip
## 8  makka-pakka       pip
## 9  makka-pakka       onk
## 10 makka-pakka       onk
# Izvuci podatke i spremi u novu varijablu
df <- subset(x = df_tab,                        # Podatci
             subset = speaker == "makka-pakka", # Izvuci iz kolone
             select = utterance)                # Izaberi varijablu 

print(df) # Prikaži
##    utterance
## 7        pip
## 8        pip
## 9        onk
## 10       onk
# Izvuci podatke "on the fly"
subset( x = df_tab,  # Podatci
        subset = speaker == "makka-pakka" ) # Izvuci iz kolone
##        speaker utterance
## 7  makka-pakka       pip
## 8  makka-pakka       pip
## 9  makka-pakka       onk
## 10 makka-pakka       onk
# Izvuci drugi dio podataka
subset( x = df_tab,  # Podatci
         select = utterance ) # Izaberi varijablu
##    utterance
## 1        pip
## 2        pip
## 3        onk
## 4        onk
## 5         ee
## 6         oo
## 7        pip
## 8        pip
## 9        onk
## 10       onk
# Izvlačenje podataka pomoću zagrada
load(file.path("nightgarden2.Rdata")) # Uvezi novce podatke
garden # Pogledaj
##            speaker utterance line
## case.1  upsy-daisy       pip    1
## case.2  upsy-daisy       pip    2
## case.3   tombliboo        ee    5
## case.4 makka-pakka       pip    7
## case.5 makka-pakka       onk    9
# Matrica za indeksiranje pomoću zagrada
Red Kolona_1 Kolona_2 Kolona_3
1 [1,1] [1,2] [1,3]
2 [2,1] [2,2] [2,3]
3 [3,1] [3,2] [3,3]
4 [4,1] [4,2] [4,3]
5 [5,1] [5,2] [5,3]
# Izvuci dio podataka iz df-a
garden[ 4:5, 1:2 ] # Alternativno `garden[ c(4,5), c(1,2) ]`
##            speaker utterance
## case.4 makka-pakka       pip
## case.5 makka-pakka       onk
# Dodatne mogućnosti
garden[ 4:5, c("speaker", "utterance") ]
##            speaker utterance
## case.4 makka-pakka       pip
## case.5 makka-pakka       onk
# Izaberi prve dvije kolone
garden[ , 1:2 ]
##            speaker utterance
## case.1  upsy-daisy       pip
## case.2  upsy-daisy       pip
## case.3   tombliboo        ee
## case.4 makka-pakka       pip
## case.5 makka-pakka       onk
# Makni treći red
garden[ -3, ]
##            speaker utterance line
## case.1  upsy-daisy       pip    1
## case.2  upsy-daisy       pip    2
## case.4 makka-pakka       pip    7
## case.5 makka-pakka       onk    9
# Zadrži samo treći red
garden[ , 3, drop = FALSE ] 
##        line
## case.1    1
## case.2    2
## case.3    5
## case.4    7
## case.5    9

SORTIRANJE, OBLIKOVANJE I SPAJANJE PODATAKA

# Sortiranje numeričkog niza
brojevi <- c(3,1,4,2) # Napravi numerički vektor
sort(x = brojevi) # Sortiraj
## [1] 1 2 3 4
sort( x = brojevi, decreasing = TRUE ) # Sortiraj
## [1] 4 3 2 1
# Sortiranje tekstualnog vektora
tekst <- c("aardvark", "zebra", "swing") # Napravi tekstualni vektor
sort( tekst ) # Sortiraj
## [1] "aardvark" "swing"    "zebra"
# Sortiranje faktorskog vektora
fac <- factor( tekst ) # Napravi faktorski vektor 
fac # Pogledaj
## [1] aardvark zebra    swing   
## Levels: aardvark swing zebra
sort(fac) # Sortiraj
## [1] aardvark swing    zebra   
## Levels: aardvark swing zebra
fac <- factor( tekst, levels = c("zebra","swing","aardvark") ) # Stvori faktorski vektor
fac # Pogledaj
## [1] aardvark zebra    swing   
## Levels: zebra swing aardvark
# Sortiranje df-a
sortFrame(garden, speaker, -line)  # Padajuće po varijabli `line`
##            speaker utterance line
## case.5 makka-pakka       onk    9
## case.4 makka-pakka       pip    7
## case.3   tombliboo        ee    5
## case.2  upsy-daisy       pip    2
## case.1  upsy-daisy       pip    1
sortFrame(garden, - speaker)       # Padajuće po varijabli `speaker`
##            speaker utterance line
## case.1  upsy-daisy       pip    1
## case.2  upsy-daisy       pip    2
## case.3   tombliboo        ee    5
## case.4 makka-pakka       pip    7
## case.5 makka-pakka       onk    9
# Napravi dva vektora
torta.1 <- c(100, 80, 0, 0, 0)
torta.2 <- c(100, 100, 90, 30, 10)
# Spoji u df
torta.df <- data.frame( torta.1, torta.2 )
torta.df
##   torta.1 torta.2
## 1     100     100
## 2      80     100
## 3       0      90
## 4       0      30
## 5       0      10
# Poveži kolone
torte.mat1 <- cbind( torta.1, torta.2 )
torte.mat1
##      torta.1 torta.2
## [1,]     100     100
## [2,]      80     100
## [3,]       0      90
## [4,]       0      30
## [5,]       0      10
# Poveži redove
cake.mat2 <- rbind( torta.1, torta.2 )
cake.mat2
##         [,1] [,2] [,3] [,4] [,5]
## torta.1  100   80    0    0    0
## torta.2  100  100   90   30   10
load(file.path("./cakes.Rdata")) # Učitaj podatke 
cakes # Pogledaj
##        time.1 time.2 time.3 time.4 time.5
## cake.1    100     80      0      0      0
## cake.2    100    100     90     30     10
## cake.3    100     20     20     20     20
## cake.4    100    100    100    100    100
class( cakes ) # Provjeri klasu
## [1] "matrix"
# Traansponiraj podatke
cakes.transponirano <- t( cakes ) # Transponiraj
cakes.transponirano # Pogledaj
##        cake.1 cake.2 cake.3 cake.4
## time.1    100    100    100    100
## time.2     80    100     20    100
## time.3      0     90     20    100
## time.4      0     30     20    100
## time.5      0     10     20    100
class( cakes.transponirano) # Provjeri klasu
## [1] "matrix"
# Transponiraj df
head(df_tab, 4) # Pogledaj df
##      speaker utterance
## 1 upsy-daisy       pip
## 2 upsy-daisy       pip
## 3 upsy-daisy       onk
## 4 upsy-daisy       onk
class(df_tab) # Provjeri klasu
## [1] "data.frame"
df_tab_t <- t(df_tab) # Transponiraj data frame
df_tab_t # Pogledaj
##           [,1]         [,2]         [,3]         [,4]         [,5]       
## speaker   "upsy-daisy" "upsy-daisy" "upsy-daisy" "upsy-daisy" "tombliboo"
## utterance "pip"        "pip"        "onk"        "onk"        "ee"       
##           [,6]        [,7]          [,8]          [,9]         
## speaker   "tombliboo" "makka-pakka" "makka-pakka" "makka-pakka"
## utterance "oo"        "pip"         "pip"         "onk"        
##           [,10]        
## speaker   "makka-pakka"
## utterance "onk"
class(df_tab_t) # Provjeri klasu
## [1] "matrix"
tFrame(df_tab) # Drugi način transponiranja
##                   V1         V2         V3         V4        V5        V6
## speaker   upsy-daisy upsy-daisy upsy-daisy upsy-daisy tombliboo tombliboo
## utterance        pip        pip        onk        onk        ee        oo
##                    V7          V8          V9         V10
## speaker   makka-pakka makka-pakka makka-pakka makka-pakka
## utterance         pip         pip         onk         onk
class(tFrame(df_tab)) # Provjeri klasu
## [1] "data.frame"
# Učitaj podatke
rm(list = ls()) # Očisti prostor
load(file.path("./repeated.Rdata")) # Učitaj podatke
who() # Pogledaj podatke u radnom prostoru
##    -- Name --   -- Class --   -- Size --
##    choice       data.frame    4 x 10    
##    drugs        data.frame    10 x 8
head(drugs,6) # Pogledaj podatke
##   id gender WMC_alcohol WMC_caffeine WMC_no.drug RT_alcohol RT_caffeine
## 1  1 female         3.7          3.7         3.9        488         236
## 2  2 female         6.4          7.3         7.9        607         376
## 3  3 female         4.6          7.4         7.3        643         226
## 4  4   male         6.4          7.8         8.2        684         206
## 5  5 female         4.9          5.2         7.0        593         262
## 6  6   male         5.4          6.6         7.2        492         230
##   RT_no.drug
## 1        371
## 2        349
## 3        412
## 4        252
## 5        439
## 6        464
# Preoblikuj u dugi format
drugs.2 <- wideToLong( data = drugs, within = "drug" )
head(drugs.2, 6)
##   id gender    drug WMC  RT
## 1  1 female alcohol 3.7 488
## 2  2 female alcohol 6.4 607
## 3  3 female alcohol 4.6 643
## 4  4   male alcohol 6.4 684
## 5  5 female alcohol 4.9 593
## 6  6   male alcohol 5.4 492
# Preoblikuj u široki format
longToWide( data=drugs.2, formula= WMC+RT ~ drug )
##    id gender WMC_alcohol RT_alcohol WMC_caffeine RT_caffeine WMC_no.drug
## 1   1 female         3.7        488          3.7         236         3.9
## 2   2 female         6.4        607          7.3         376         7.9
## 3   3 female         4.6        643          7.4         226         7.3
## 4   4   male         6.4        684          7.8         206         8.2
## 5   5 female         4.9        593          5.2         262         7.0
## 6   6   male         5.4        492          6.6         230         7.2
## 7   7   male         7.9        690          7.9         259         8.9
## 8   8   male         4.1        486          5.9         230         4.5
## 9   9 female         5.2        686          6.2         273         7.2
## 10 10 female         6.2        645          7.4         240         7.8
##    RT_no.drug
## 1         371
## 2         349
## 3         412
## 4         252
## 5         439
## 6         464
## 7         327
## 8         305
## 9         327
## 10        498

RAD SA TEKSTOM

# Stvori tekstualni vektor.
zivotinje <- c( "mačka", "pas", "klokan", "kit" )
# Samo prva tri slova u riječi
strtrim( x = zivotinje, width = 3 )
## [1] "mač" "pas" "klo" "kit"
# Izvuci drugo i treće slovo iz svake riječi
substr( x = zivotinje, start = 2, stop = 3 )
## [1] "ač" "as" "lo" "it"
# Spoji dvije riječi u jednu
paste( "hello", "world" )
## [1] "hello world"
# Spoji dvije riječi u jednu;prilagođeno
paste( "hello", "world", sep = "." )
## [1] "hello.world"
# Složenije spajanje
hw <- c( "hello", "world" ) # Stvori txt vektor
ag <- c( "annonymus", "government" ) # Stvori txt vektor
paste( hw, ag ) # Spoji
## [1] "hello annonymus"  "world government"
paste(hw,ag, sep = ".", collapse = ":::")
## [1] "hello.annonymus:::world.government"
# Definiraj tekstualnu varijablu
annonymus <- "To su bila najbolja vremena. To su uistinu bila najbolja imena."
# Razdvoji tekstualnu varijablu
annonymus1 <- strsplit(x = annonymus, split = " ", fixed = TRUE)
annonymus1 # Pogledaj podatke
## [[1]]
##  [1] "To"       "su"       "bila"     "najbolja" "vremena." "To"      
##  [7] "su"       "uistinu"  "bila"     "najbolja" "imena."
unlist(annonymus1) # Makni strukturu liste
##  [1] "To"       "su"       "bila"     "najbolja" "vremena." "To"      
##  [7] "su"       "uistinu"  "bila"     "najbolja" "imena."
# Stvori vektor
pivo <- c("crno pšenično", "mali lager", "svijetlo pšenično")
# Pronađi riječi koje sadržavaju "no"
grep( pattern = "no", x = pivo, fixed = TRUE)
## [1] 1 3
# Pronađi riječi koje sadržavaju "no"
grep( pattern = "no", # Traži 
      x = pivo,       # Podatci
      fixed = TRUE,   # Fiksna separacija
      value = TRUE)   # Vrati vrijednost
## [1] "crno pšenično"     "svijetlo pšenično"
# Zamijeni dio riječi
gsub( pattern = "no", # Zamijeni ovo
      replacement = "veno", # Zamijeni sa
      x = pivo,       # Podatci
      fixed = TRUE)   # Fiksna separacija 
## [1] "crveno pšeničveno"   "mali lager"          "svijetlo pšeničveno"
# Zamijeni prvi match
sub( pattern = "m", # Zamijeni ovo
      replacement = "veno", # Zamijeni sa
      x = pivo,       # Podatci
      fixed = TRUE)   # Fiksna separacija
## [1] "crno pšenično"     "venoali lager"     "svijetlo pšenično"

UVOZ PODATAKA U R

data <- read.csv(
  file = file.path("./booksales2.csv"), # Podatci
  header = FALSE, # Nazivi kolona
  skip = 8,       # Preskoči broj redova kod uvoza
  quote = "*",    # Navodnike tumači kao
  sep = "\t",     # Razmak je separator
  na.strings = "NFI") # Nepostojeće vrijednosti 
head( data, 5 ) # Pogledaj podatke
##          V1 V2  V3   V4
## 1   January 31   0 high
## 2 February  28 100 high
## 3    March  31 200  low
## 4    April  30  50  out
## 5    May    31  NA  out
library( foreign )     # Učitaj paket
X <- read.spss( file.path("./datafile.sav" ))   # Učitaj spss file
X <- as.data.frame( X )            # Napravi data frame
X <- read.spss( file = "datafile.sav", to.data.frame = TRUE ) # Brža varijanta
library( gdata )                   # Učitaj paket
X <- read.xls( "./datafile.xlsx" )   # Napravi df
# Napravi matricu
red_1 <- c(2,3,1) # Stvori vektor
red_2 <- c(5,6,7) # Stvori vekto
M <- rbind(red_1, red_2) # Poveži u matricu
print(M) # Prikaži
##       [,1] [,2] [,3]
## red_1    2    3    1
## red_2    5    6    7
# Prilagodi matricu
colnames(M) <- c( "col.1", "col.2", "col.3" ) # Dodaj nazive kolona
print(M) # Prikaži
##       col.1 col.2 col.3
## red_1     2     3     1
## red_2     5     6     7
load(file.path("./likert.Rdata")) # Učitaj podatke
likert.raw # Pogledaj
##  [1] 1 7 3 4 4 4 2 6 5 5
# Stvori ordinalnu skalu
likert.ordinal <- factor( x = likert.raw,         # Podatcia 
                           levels = seq(7,1,-1),  # Najsnažnije 1, najslabije is 7
                           ordered = TRUE )       # Sortiraj
print( likert.ordinal ) # Pogledaj
##  [1] 1 7 3 4 4 4 2 6 5 5
## Levels: 7 < 6 < 5 < 4 < 3 < 2 < 1
# Dodaj kategorije
levels( likert.ordinal ) <- c( "snažno.protiv",
                               "protiv",
                               "slabo.protiv",
                               " neutralno",
                               "slabo.za",
                               "snažno.za",
                               "za") 
print( likert.ordinal ) # Pogledaj                        
##  [1] za            snažno.protiv slabo.za       neutralno     neutralno   
##  [6]  neutralno    snažno.za     protiv        slabo.protiv  slabo.protiv 
## 7 Levels: snažno.protiv < protiv < slabo.protiv < ... < za
danas <- Sys.Date() # Stvori varijablu koja sadržava datum
print(danas) # Prikaži varijablu
## [1] "2019-10-28"
danas + 1    # Dodaj jedan dan
## [1] "2019-10-29"
danas + 365  # Dodaj više dana
## [1] "2020-10-27"
weekdays(danas)
## [1] "ponedjeljak"