Tekst ja aeg

Kataloog ja teek

setwd("c:/jaagup/16/analyytika")
library(stringr)

Teksti lugemise katsetused

Esimesed viis rida

readLines("first_test.csv", n=5)
## [1] "\"code\";\"aeifl\";\"tvil\";\"myktin\";\"test_start_time\""      
## [2] "\"23000\";\"a l i v\";\"z v \";\"k i y\";\"2014-12-08 09:05:43\""
## [3] "\"23001\";\"a,l,\";\"l,\";\"i,k,\";\"2014-12-08 09:05:21\""      
## [4] "\"23002\";\"ae\";\"l\";\"mi\";\"2014-12-08 09:06:27\""           
## [5] "\"23003\";\"ea\";\"lvt\";\"mkt\";\"2014-12-08 09:05:17\""

Andmed massiivi

m=readLines("first_test.csv", n=5)

Esimene rida

cat(m[1])
## "code";"aeifl";"tvil";"myktin";"test_start_time"

Kogu massiiv

cat(m)
## "code";"aeifl";"tvil";"myktin";"test_start_time" "23000";"a l i v";"z v ";"k i y";"2014-12-08 09:05:43" "23001";"a,l,";"l,";"i,k,";"2014-12-08 09:05:21" "23002";"ae";"l";"mi";"2014-12-08 09:06:27" "23003";"ea";"lvt";"mkt";"2014-12-08 09:05:17"

Koos reavahetusega

cat(m,sep="\n")
## "code";"aeifl";"tvil";"myktin";"test_start_time"
## "23000";"a l i v";"z v ";"k i y";"2014-12-08 09:05:43"
## "23001";"a,l,";"l,";"i,k,";"2014-12-08 09:05:21"
## "23002";"ae";"l";"mi";"2014-12-08 09:06:27"
## "23003";"ea";"lvt";"mkt";"2014-12-08 09:05:17"

Paste võtab iga elemendi eraldi

paste(m)
## [1] "\"code\";\"aeifl\";\"tvil\";\"myktin\";\"test_start_time\""      
## [2] "\"23000\";\"a l i v\";\"z v \";\"k i y\";\"2014-12-08 09:05:43\""
## [3] "\"23001\";\"a,l,\";\"l,\";\"i,k,\";\"2014-12-08 09:05:21\""      
## [4] "\"23002\";\"ae\";\"l\";\"mi\";\"2014-12-08 09:06:27\""           
## [5] "\"23003\";\"ea\";\"lvt\";\"mkt\";\"2014-12-08 09:05:17\""

Tegelik lugemine

m=readLines("first_test.csv")
for(i in 1:length(m)){
  c=str_count(m[i], '"')
  if(c %% 2 !=0){ #real olevate paaritu arvu jutumärkide korral
    #semikoolonile mitte vastu puutuv jutumärk kõrvaldatakse
    cat(m[i])
    m[i]=gsub('([^;])"([^;])', '\\1\\2', m[i])
    cat(m[i])
  }
}
## "62048";"a e f d i u v l ";"l i t v u qwergthyjukoash\"ddo ";"k i t v u d  m n p";"2015-03-30 13:32:09""62048";"a e f d i u v l ";"l i t v u qwergthyjukoash\ddo ";"k i t v u d  m n p";"2015-03-30 13:32:09"

Analoog:

Püüan tsüklist loobuda ning teha nõnda, nagu juhendis õpetati

m=readLines("first_test.csv")

Jutumärkide arv ridade kaupa

arvud=str_count(m, '"')
head(arvud)
## [1] 10 10 10 10 10 10

Read, kus jutumärke paaritu arv. Hetkel paistab olema vaid üks selline rida, kuid neid võib ka rohkem tulla.

reanr=which(arvud %% 2 != 0)
reanr
## [1] 4950

Vastava rea sisu

m[reanr]
## [1] "\"62048\";\"a e f d i u v l \";\"l i t v u qwergthyjukoash\\\"ddo \";\"k i t v u d  m n p\";\"2015-03-30 13:32:09\""

Otsitud jutumärgi asukoht. Kuna muud jutumärgid peavad alles jääma, siis konkreetse rea pealt otsin kohta, kus on jutumärk koos temale järgneva d-tähega. Koha juures näidatakse algus ja ots.

koht=str_locate(m[reanr], '"d')
koht
##      start end
## [1,]    55  56

Paistab olema maatriksi klassist ning meeldetuletuseks pärast vahepealset otsimist panen kirja, et maatriksi lahtrite poole võib pöörduda nii numbrite kui pealkirjade kaudu.

class(koht)
## [1] "matrix"
koht[1, "start"]
## start 
##    55

Asendan jutumärgi koos järgneva d-tähega stringiga “xd”. Katsete tulemusena selgus, et asendatav koht peab olema sama pikk (nagu C puhul tähemassiividega tegutsedes)

substr(m[reanr], koht[1, "start"], koht[1, "end"])="xd"

Rida pärast asendamist, segava jutumärgi asemel on x-täht

m[reanr]
## [1] "\"62048\";\"a e f d i u v l \";\"l i t v u qwergthyjukoash\\xddo \";\"k i t v u d  m n p\";\"2015-03-30 13:32:09\""

Lühem variant faili lugemiseks ja segava jutumärgi eemaldamiseks

m=readLines("first_test.csv")
arvud=str_count(m, '"')
reanr=which(arvud %% 2 != 0)
koht=str_locate(m[reanr], '"d')
substr(m[reanr], koht[1, "start"], koht[1, "end"])="xd"

Muudetud tekstist andmed sisse

andmed=read.table(file=textConnection(paste(m, sep="\n")), sep=";", header=TRUE, stringsAsFactors = FALSE)
head(andmed)
##    code   aeifl  tvil myktin     test_start_time
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21
## 3 23002      ae     l     mi 2014-12-08 09:06:27
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40
## 6 23005     e,a    il      m 2014-12-08 09:05:39

Jäetakse alles need andmed, kus kolm vastusetulpa + ajatulp kokku sisaldavad midagi

andmed=andmed[paste(andmed$aeifl,andmed$tvil,andmed$myktin, andmed$test_start_time, sep="")!="", ]

Esimeses vastusetulbas puuduvate andmete leidumine

andmed$aiefl==""
## logical(0)

Teises andmetulbas puuduvate väärtuste esinemise kohad

which(andmed$tvil=="")
##  [1]  206  290  684  883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839

Kolmandas andmetulbas puuduvate väärtuste leidmise kohad

which(andmed$myktin=="")
##  [1]  206  290  684  883 1253 1263 1433 1464 1869 2174 2461 2462 2463 2464
## [15] 2465 2467 2468 2471 2472 2473 2475 2733 2837 2863 3093 4372 4508 4738
## [29] 4796 5025 5792 5794 6017 6032 6614 6617 6620 6738 6743 6744 6822 6825
## [43] 6826 6827 6839

Püüan mõlemite ühiseid puuduvaid kohti saada, kuid kahe &-märgiga saan tühjuse. Manuaali lugedes leian, et üldjah oleks siis, kui mõlemil tingimusel kõik tunnused jahid on. Kuna aga esimene on FALSE siis edasi ei vaadata ja kokku ongi FALSE

which(andmed$myktin=="" && andmed$tvil=="") # ei toimi
## integer(0)

&-märgi katsetused

c(TRUE, TRUE, TRUE) & c(TRUE, TRUE, TRUE)
## [1] TRUE TRUE TRUE
c(TRUE, TRUE, TRUE) && c(TRUE, TRUE, TRUE)
## [1] TRUE
c(TRUE, FALSE, TRUE) & c(TRUE, TRUE, TRUE)
## [1]  TRUE FALSE  TRUE
c(TRUE, TRUE, TRUE) && c(TRUE, TRUE, TRUE)
## [1] TRUE

Ühe &-märgiga jaatus paistab toimima

which(andmed$myktin=="" & andmed$tvil=="")
##  [1]  206  290  684  883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839

Aja puudumise kohad

which(andmed$test_start_time=="")
## integer(0)

Kas konkreetses lahtris väärtus puudub

andmed[206, "tvil"]==""
## [1] TRUE

Sama arvuna

as.numeric(andmed[206, "tvil"]=="")
## [1] 1

Puuduvate väärtuste arvu otsimine rea kohta

Iga rea kohta käivitatakse funktsioon, kus käiakse läbi selle rea kõik veerud, kontrollitakse väärtuse puudumist (võrdumine tühja sõnega) ning summeeritakse puuduvad väärtused (nende arv) kokku. Nii saab iga rea kohta arvu, et mitu väärtust selles puudub.

Kõhutunne ütleb, et seda peaks saama ka kuidagi lihtsamalt/elegantsemalt teha. Apply-le ridade kaupa miski funktsioon ette anda - aga mõned erisugused katsed igatahes selles suunas sihile ei viinud.

puuduvaid=sapply(1:nrow(andmed), function(reanumber){sum(
  sapply(1:ncol(andmed), function(veerunumber){as.numeric(andmed[reanumber, veerunumber]=="")})
)})
head(puuduvaid)
## [1] 0 0 0 0 0 0

Ridade arvu jaotus puuduvate väärtuste arvu kaupa

table(puuduvaid)
## puuduvaid
##    0    1    3 
## 7583    6   42

Millistel reanumbritel on kolm puuduvat väärtust

which(puuduvaid==3)
##  [1]  206  290  684  883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839

Need read ise (päis)

head(andmed[puuduvaid==3, ])
##       code aeifl tvil myktin     test_start_time
## 226  23225                   2015-01-07 09:55:58
## 332  23331                   2015-03-06 10:36:45
## 784  23783                   2015-01-19 11:13:18
## 1019 24018                   2015-03-06 09:08:40
## 1565 32364                   2015-02-13 11:46:42
## 1575 32374                   2015-02-13 11:45:40

Ja read, kus on muu arv (vähem) puuduvaid

head(andmed[puuduvaid!=3, ])
##    code   aeifl  tvil myktin     test_start_time
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21
## 3 23002      ae     l     mi 2014-12-08 09:06:27
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40
## 6 23005     e,a    il      m 2014-12-08 09:05:39

Ja read, kus on muu nullist suurem arv puudujaid

head(andmed[puuduvaid!=3 & puuduvaid>0, ])
##       code    aeifl   tvil myktin     test_start_time
## 433  23432          v    l  k   n 2015-03-13 10:30:18
## 486  23485             123  12345 2015-03-11 09:08:54
## 1400 32199             LTV    TVL 2015-02-05 10:38:14
## 3069 42668      a,l     l,        2015-02-05 08:52:26
## 3943 52242  e,a,l,i  l,t,i        2015-03-30 10:55:50
## 7532 82331 A L E V  L V I         2015-03-03 10:31:30

Jätame alles vaid read, kus on vähem kui kolm puuduvat väärtust

andmed=andmed[puuduvaid<3, ]

Andmete ettevalmistamise lõpp


Teksti otsimiskäskude katsetused

Vastuse õigsuse hindamise tarbeks

Kas a sisaldub kalas - jah (1)

grep("a", "kala")
## [1] 1

b ei sisaldu

grep("b", "kala")
## integer(0)

Uuritavad tähed

tahed="abc"

Üksiku tähe kättesaamiseks peavad algus ja lõpp kattuma

substr(tahed, 2, 2)
## [1] "b"

Tähtede arvu kätte saamiseks sobib nchar (mitte length)

nchar(tahed)
## [1] 3

Kas konkreetne täht sisaldub sõnas “kaba”

a on, b on, c ei ole

sapply(1:nchar(tahed), function(nr){grep(substr(tahed, nr, nr), "kaba")})
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1
## 
## [[3]]
## integer(0)

Summana kokku loetu, et mitu tähtede stringis olevat sümbolit leidub sõnas “kaba”. Sarnaselt siis võimalik vaadata, et kui palju lapse pakutud tähti on pihta läinud.

sum(unlist(sapply(1:nchar(tahed), function(nr){grep(substr(tahed, nr, nr), "kaba")})))
## [1] 2

Sama tulemus hulgatehete abil. Teksti muutmiseks vektoriks eraldi väike funktsioon, kuna lühemat lahendust ei leidnud.

 vektoriks <- function(tekst){
     sapply(1:nchar(tekst), function(x) substring(tekst, x, x))  
 }
 pakutud=vektoriks(tahed)
 uuritav=vektoriks("bcd")
 oiged=intersect(pakutud, uuritav)
 oiged
## [1] "b" "c"
 valed=setdiff(pakutud, uuritav)
 valed
## [1] "a"
 length(oiged)
## [1] 2
 length(valed)
## [1] 1

Skoori arvutus

 length(oiged)-length(valed)
## [1] 1

Tegelike andmete juurde

head(andmed)
##    code   aeifl  tvil myktin     test_start_time
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21
## 3 23002      ae     l     mi 2014-12-08 09:06:27
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40
## 6 23005     e,a    il      m 2014-12-08 09:05:39
veerunr=2

Veeru pealkiri paistab klappima õigete vastustähtedega

names(andmed)[veerunr]
## [1] "aeifl"

Konkreetse veeru kohta pihtaläinud tähtede arv

sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))

Sama valemi abil lisatulp ning sealt nähtavale esimesed read

head(cbind(andmed, oigeid1=sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))))
##    code   aeifl  tvil myktin     test_start_time oigeid1
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43       3
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21       2
## 3 23002      ae     l     mi 2014-12-08 09:06:27       2
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17       2
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40       3
## 6 23005     e,a    il      m 2014-12-08 09:05:39       2

Vastuseveergude 2-4 pihtaläinud tähtede arvu summa

sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
})

Samast esimesed read nähtavale

head(cbind(andmed, sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
})))
##    code   aeifl  tvil myktin     test_start_time 1 2 3
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43 3 1 3
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002      ae     l     mi 2014-12-08 09:06:27 2 1 2
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17 2 3 3
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40 3 3 3
## 6 23005     e,a    il      m 2014-12-08 09:05:39 2 2 1

Katse õigete vastuste summa apply abil välja arvutada

apply(sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
}), 1, sum)

Samast esimesed read nähtavale

head(cbind(andmed, summa=apply(sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
}), 1, sum)))
##    code   aeifl  tvil myktin     test_start_time summa
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43     7
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21     5
## 3 23002      ae     l     mi 2014-12-08 09:06:27     5
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17     8
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40     9
## 6 23005     e,a    il      m 2014-12-08 09:05:39     5

Lahendus funktsioonide abil

Valemid ja arvutused kippusid üksteise otsa lisades korraga tabamiseks liialt suureks kasvama. Kui nüüd sinna lisada veel valede pakkumiste leidmine ja maha lahutamine, siis keerukus kasvaks veelgi. Jagan tegevused osadeks. Funktsioon leidmaks, mitu õiget oli pakutute hulgas

oigeidlahtris <- function(pakutud, oiged){
  pakutud=tolower(pakutud)
  sum(unlist(sapply(1:nchar(oiged), function(veerutahenr){
    grep(substr(oiged, veerutahenr, veerutahenr), pakutud)
  })))
}

Funktsiooni katsetus

oigeidlahtris("abc", "bcd")
## [1] 2

Valede leidmiseks arvestan kõigepealt ainult tähti a-z, et eraldajaks pandud komad, tühikud ja muud sümbolid ei segaks.

#sum vaid vastuse arvuliseks muutmiseks
valesidlahtris <- function(pakutud, oiged){
  pakutud=tolower(pakutud)
  pakutud=str_replace_all(pakutud, "[^a-z]", "")
  sum(unlist(sapply(1:nchar(pakutud), function(veerutahenr){
    1-sum(grep(substr(pakutud, veerutahenr, veerutahenr), oiged))
  })))
}

Vale oleks siis a, aga mitte tühik

valesidlahtris("ab c", "bcd")
## [1] 1

Lahtri üldskoori leidmiseks tuleb õigetest valed maha lahutada

lahtriskoor <- function(pakutud, oiged){
  oigeidlahtris(pakutud, oiged)-valesidlahtris(pakutud, oiged)
}

Õiged on b ja c

oigeidlahtris("ab c", "bcd")
## [1] 2

Valena maha a

lahtriskoor("ab c", "bcd")
## [1] 1

Käsk grep annab vaste mitteleidmisel tulemuseks integer-tüüpi nulli.

grep("a","b")
## integer(0)

Tehet aga ei taheta vastu võtta

1-grep("a","b")
## numeric(0)

Selle sai küll numbriks muuta

as.numeric(grep("a","b"))
## numeric(0)

Aga sellegipoolest polnud võimalik tehtes kasutada. Kiusatus on mitteleidumisele panna vastuseks 1 ja leidumisele null ehk siis tehe 1-grep(“a”, “b”)

1-as.numeric(grep("a","b"))
## numeric(0)

Toimiv lahendus õnnestus tekitada sum-funktsiooni abil - ehkki arvatavasti leidub kusagil ka mõni loogilisem moodus.

1-sum(grep("a","b"))
## [1] 1

Õigete arv tulpade kaupa.

sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) {oigeidlahtris(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})

Valede arv tulpade kaupa

sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) {valesidlahtris(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})

Lahtriskoor tulpade kaupa

sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})

Esimeste ridade lahtriskoor

head(
cbind(andmed, 
sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
))
##    code   aeifl  tvil myktin     test_start_time 1 2 3
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43 2 0 3
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002      ae     l     mi 2014-12-08 09:06:27 2 1 2
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17 2 3 3
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40 3 3 3
## 6 23005     e,a    il      m 2014-12-08 09:05:39 2 2 1

Skoor andmestiku külge tulpadena. Jällegi mõte, et äkki annaks sellise funktsiooni rakendamist andmestiku ridadele mõne andekama käsuga teha, kui sapplyga veerud ja read eraldi läbi käies?

andmed=cbind(andmed, 
sapply(2:4, function(veerunr){
  sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
)

Lisatulpadega andmete esimesed read.

head(andmed)
##    code   aeifl  tvil myktin     test_start_time 1 2 3
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43 2 0 3
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002      ae     l     mi 2014-12-08 09:06:27 2 1 2
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17 2 3 3
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40 3 3 3
## 6 23005     e,a    il      m 2014-12-08 09:05:39 2 2 1

Koondskoori arvutamine. Saaks arvatavasti ka eelnevate tulpade kaudu (tekkinud tulbad salapäraste nimedega 1, 2 ja 3, aga sum-funktsioon teeb praegu sama töö ära)

andmed$koondskoor=sapply(1:nrow(andmed), function(reanr) {
  sum(
  sapply(2:4, function(veerunr){lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
  )
})

Algusots koos koondskooriga

head(andmed)
##    code   aeifl  tvil myktin     test_start_time 1 2 3 koondskoor
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43 2 0 3          5
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21 2 1 2          5
## 3 23002      ae     l     mi 2014-12-08 09:06:27 2 1 2          5
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17 2 3 3          8
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40 3 3 3          9
## 6 23005     e,a    il      m 2014-12-08 09:05:39 2 2 1          5

Tulemuste jaotus kolme ülesande peale kokku

hist(andmed$koondskoor, main="Tulemuste jaotus", xlab="Punktide arv", ylab="Sagedus")

Arvuline väljund nendest

table(andmed$koondskoor)
## 
##  -46  -38  -35  -34  -30  -29  -28  -26  -24  -22  -21  -20  -19  -18  -17 
##    1    2    2    4    1    1    2    1    1    2    4    5    6    4    2 
##  -16  -15  -14  -13  -12  -11  -10   -9   -8   -7   -6   -5   -4   -3   -2 
##    8    3   22   22   10    6   15   13   12   16   18   18   24   21   26 
##   -1    0    1    2    3    4    5    6    7    8    9   10   11   12   13 
##   52   86  102  208  596  596  709 1069  975  960  752  504  360  190   92 
##   14   15 
##   58    8

Suvaliste pakkumiste pealt tulnud suured ja harvad negatiivsed skoorid eemaldatud, jaotus histogrammina.

hist(andmed$koondskoor, xlim=c(-5, 15), main="Tulemuste jaotus", xlab="Punktide arv", ylab="Sagedus")

Kuupäevad

Nädalapäev

weekdays(as.POSIXct("2014-12-08 09:05:43"))
## [1] "esmaspäev"

Kuupäev ajast

as.Date(as.POSIXct("2014-12-08 09:05:43"))
## [1] "2014-12-08"

Tulba test_start_time muutmine POSIXct tüüpi

andmed$test_start_time=as.POSIXct(andmed$test_start_time)

Päevade kaupa soorituste arvude kätte saamine. Table-funktsioonist väljund värskelt leitud funktsiooniga as.data.frame.table

paevakogused=as.data.frame.table(table(as.Date(andmed$test_start_time)))
colnames(paevakogused)=c("soorituskuupaev", "kogus")
head(paevakogused, 10)
##    soorituskuupaev kogus
## 1       2014-12-08    48
## 2       2014-12-09    39
## 3       2014-12-12     5
## 4       2014-12-15    36
## 5       2014-12-16    71
## 6       2014-12-17    16
## 7       2014-12-18    41
## 8       2015-01-06     8
## 9       2015-01-07    54
## 10      2015-01-08    15
head(paevakogused[rev(order(paevakogused$kogus)), ], 10)
##    soorituskuupaev kogus
## 53      2015-03-11   318
## 54      2015-03-12   314
## 59      2015-03-25   298
## 52      2015-03-10   257
## 44      2015-02-26   234
## 50      2015-03-06   226
## 57      2015-03-23   202
## 48      2015-03-04   192
## 60      2015-03-26   191
## 37      2015-02-16   183

Vahemikus leidmine, millisel päeval kui palju teste

Vahemiku algus ja ots

ajavahemik=range(as.Date(andmed$test_start_time))

Selle sees kõik olemasolevad päevad

koikpaevad=data.frame(seq(from=ajavahemik[1], to = ajavahemik[2], by=1))

Ja näide, et hakati õigesti lugema

head(koikpaevad)
##   seq.from...ajavahemik.1...to...ajavahemik.2...by...1.
## 1                                            2014-12-08
## 2                                            2014-12-09
## 3                                            2014-12-10
## 4                                            2014-12-11
## 5                                            2014-12-12
## 6                                            2014-12-13

Tulbale arusaadav nimi

names(koikpaevad)=c("kuupaev")

Kõikide päevade külge eraldi tulbana testitud päevadel saadud tulemused

kogused=merge(koikpaevad, paevakogused, by.x="kuupaev", by.y="soorituskuupaev", all=TRUE)

Väljund ekraanile

head(kogused)
##      kuupaev kogus
## 1 2014-12-08    NA
## 2 2014-12-08    48
## 3 2014-12-09    NA
## 4 2014-12-09    39
## 5 2014-12-10    NA
## 6 2014-12-11    NA

Kui tol päeval teste ei tehtud, siis selle päeva testide arv on null

kogused[is.na(kogused$kogus), "kogus"]=0

Tulemuse kontroll

head(kogused)
##      kuupaev kogus
## 1 2014-12-08     0
## 2 2014-12-08    48
## 3 2014-12-09     0
## 4 2014-12-09    39
## 5 2014-12-10     0
## 6 2014-12-11     0

Summeeritud kogused päevade kaupa

kumulatiivnekogus=cumsum(kogused$kogus)

Algusots kontrolliks

head(kumulatiivnekogus)
## [1]  0 48 48 87 87 87

Kasvukõver nähtavale

plot(kumulatiivnekogus, xlab="Päeva number")

Tulemus koos ajateljega

plot(kogused$kuupaev, kumulatiivnekogus)

Testide arvud nädalapäevade kaupa

table(weekdays(andmed$test_start_time))
## 
## esmaspäev kolmapäev neljapäev     reede teisipäev 
##      1309      1918      1597      1191      1574

Nädalapäev omaette tulbaks

andmed$nadalapaev=weekdays(andmed$test_start_time)

Nädalapäevade nimed sisulisse järjestusse

andmed$nadalapaev=factor(andmed$nadalapaev, levels=c("esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev"), ordered=TRUE)

Andmete algusotsa kontroll

head(andmed)
##    code   aeifl  tvil myktin     test_start_time 1 2 3 koondskoor
## 1 23000 a l i v  z v   k i y 2014-12-08 09:05:43 2 0 3          5
## 2 23001    a,l,    l,   i,k, 2014-12-08 09:05:21 2 1 2          5
## 3 23002      ae     l     mi 2014-12-08 09:06:27 2 1 2          5
## 4 23003      ea   lvt    mkt 2014-12-08 09:05:17 2 3 3          8
## 5 23004   a l f v l i  k i n 2014-12-08 09:05:40 3 3 3          9
## 6 23005     e,a    il      m 2014-12-08 09:05:39 2 2 1          5
##   nadalapaev
## 1  esmaspäev
## 2  esmaspäev
## 3  esmaspäev
## 4  esmaspäev
## 5  esmaspäev
## 6  esmaspäev

Tüübi kontroll

class(andmed$nadalapaev)
## [1] "ordered" "factor"

Jaotus nädalapäevade kaupa - sedakorda sisuliselt järjestatult

table(andmed$nadalapaev)
## 
## esmaspäev teisipäev kolmapäev neljapäev     reede   laupäev  pühapäev 
##      1309      1574      1918      1597      1191         0         0

Koondskoorid nädalapäevade kaupa - keskmised ja standardhälbed

aggregate(andmed$koondskoor, by=list(andmed$nadalapaev), FUN=function(x)c(keskmine=mean(x), standardhalve=sd(x)))
##     Group.1 x.keskmine x.standardhalve
## 1 esmaspäev   6.255921        4.585517
## 2 teisipäev   5.801779        4.881049
## 3 kolmapäev   6.282065        4.038831
## 4 neljapäev   6.016907        4.541134
## 5     reede   6.314861        4.308573

Koondskoori väärtused nädalapäeviti - karp ja vurrud. Boxplot-käsklusega nõnda kergelt ei tulnud

plot(koondskoor ~ nadalapaev, andmed, las=2)

#boxplot(andmed$nadalapaev, andmed$koondskoor)

Testide sooritamise arv tundide kaupa

table(format(andmed$test_start_time, "%H"))
## 
##   07   08   09   10   11   12   13   14   15   16 
##   22 1271 1511 1597 1369 1104  551  145   18    1

Jällegi table-tulemuse lugemisraskused. Kahekordne transponeerimine nagu mõjus hästi. Aga tagantjärele asendasin funktsiooniga as.data.frame.table().

#tunnikaupa=t(t(table(format(andmed$test_start_time, "%H"))))
tunnikaupa=as.data.frame.table(table(format(andmed$test_start_time, "%H")))
colnames(tunnikaupa)=c("tund", "testidearv")

Tunnid, kus tehti vähemasti 30 testi

tunnikaupa[tunnikaupa$testidearv>=30, ]
##   tund testidearv
## 2   08       1271
## 3   09       1511
## 4   10       1597
## 5   11       1369
## 6   12       1104
## 7   13        551
## 8   14        145

Koondskoori jaotus tundide kaupa

koond=aggregate(andmed$koondskoor, by=list(format(andmed$test_start_time, "%H")), FUN=function(x)c(keskmine=mean(x), standardhalve=sd(x), kogus=length(x)))

#subset(koond, x.kogus>=30)

Tulpasid paistab rohkem, aga kergesti kätte ei saa.

head(koond)
##   Group.1  x.keskmine x.standardhalve     x.kogus
## 1      07    6.590909        9.414574   22.000000
## 2      08    6.056648        3.958239 1271.000000
## 3      09    6.017869        4.508896 1511.000000
## 4      10    5.900438        4.815465 1597.000000
## 5      11    6.100804        4.177887 1369.000000
## 6      12    6.437500        4.622630 1104.000000

Kui arvestada, et x on omaette maatriks ning sealt vaadata, millise rea kogus ületab kolmekümmet, siis võimalik ka üldtabeliset sobivad read koos tundidega kuvada.

koond[koond$x[,"kogus"]>30, ]
##   Group.1  x.keskmine x.standardhalve     x.kogus
## 2      08    6.056648        3.958239 1271.000000
## 3      09    6.017869        4.508896 1511.000000
## 4      10    5.900438        4.815465 1597.000000
## 5      11    6.100804        4.177887 1369.000000
## 6      12    6.437500        4.622630 1104.000000
## 7      13    6.662432        4.337409  551.000000
## 8      14    6.620690        4.084301  145.000000
class(koond)
## [1] "data.frame"

Otsesed üldtabeli tulbad aga vaid grupeerimistunnus ja vaste

names(koond)
## [1] "Group.1" "x"

Vaste on omaette maatriks, mis data.frame ühte tulpa pressitud

class(koond$x)
## [1] "matrix"

Trikid andmete kätte saamiseks - et oleksid omaette tulpadena kasutatavad. Äkki on ka mõni parem moodus olemas kokkupressitud tulpade kätte saamiseks?

koond3=cbind(koond$x, tund=as.numeric(koond$Group.1))
koond3
##       keskmine standardhalve kogus tund
##  [1,] 6.590909      9.414574    22    7
##  [2,] 6.056648      3.958239  1271    8
##  [3,] 6.017869      4.508896  1511    9
##  [4,] 5.900438      4.815465  1597   10
##  [5,] 6.100804      4.177887  1369   11
##  [6,] 6.437500      4.622630  1104   12
##  [7,] 6.662432      4.337409   551   13
##  [8,] 6.620690      4.084301   145   14
##  [9,] 2.500000      8.528499    18   15
## [10,] 6.000000            NA     1   16

Tulbad nüüd õnneks eraldi olemas

colnames(koond3)
## [1] "keskmine"      "standardhalve" "kogus"         "tund"

Ja saab sobivad read ka välja kuvada - tundide andmed, kus rohkem teste tehtud.

koond3[koond3[, "kogus"]>=30,]
##      keskmine standardhalve kogus tund
## [1,] 6.056648      3.958239  1271    8
## [2,] 6.017869      4.508896  1511    9
## [3,] 5.900438      4.815465  1597   10
## [4,] 6.100804      4.177887  1369   11
## [5,] 6.437500      4.622630  1104   12
## [6,] 6.662432      4.337409   551   13
## [7,] 6.620690      4.084301   145   14