--- title: "agregeerimine" author: "Jaagup Kippar" date: "6 mai 2016" output: html_document --- Andmed sisse ```{r } andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".") set.seed(1234) andmed <- as.data.frame(lapply(andmed, function(x) x[sample(c(TRUE, NA), prob = c(0.9, 0.1), size = length(x), replace = TRUE)])) ``` Põhjuse järgi grupeerimine ja keskmise leidmine kahel moel ```{r } tapply(andmed$G3, andmed$reason, mean, na.rm=TRUE) aggregate(andmed$G3, by=list(andmed$reason), FUN=mean, na.rm=TRUE) ``` Mitme tulba järgi grupeerimine ```{r } aggregate(andmed$G3, by=list(andmed$reason, andmed$sex), FUN=mean, na.rm=TRUE) tapply(andmed$G3, list(andmed$reason, andmed$sex), FUN=mean, na.rm=TRUE) ``` Loendamine tunnuspaaride kaupa ```{r } table(andmed$reason, andmed$sex) tapply(andmed$G3, list(andmed$reason, andmed$sex), FUN=length) aggregate(andmed$G3, list(andmed$reason, andmed$sex), FUN=length) ``` Puuduvate väärtuste välja toomine ```{r } table(andmed$reason, andmed$sex, useNA="always") ``` Reaprotsendid ```{r } prop.table(tapply(andmed$G3, list(andmed$reason, andmed$sex), FUN=length), 1) sapply(andmed, class) ``` Sama puuduvaid seoseid arvestades ```{r } prop.table(table(andmed$reason, andmed$sex, useNA="always"), 1) ``` Sama eraldi käskudega arvutades ```{r } abi=as.data.frame(tapply(andmed$G3, list(andmed$reason, andmed$sex), FUN=length)) abi$kokku=rowSums(abi) abi$F=abi$F/abi$kokku abi$M=abi$M/abi$kokku abi$kokku=NULL abi ``` Helbi järgi teeb apply käsklus andmestiku kõigepealt maatriksiks (kus on kõik andmed ühte tüüpi) ning alles siis hakkab sealt pealt midagi arvutama. ```{r } apply(andmed, 2, class) ``` Funktsioon sapply paistab tulpade kaupa toimetama. ```{r } sapply(andmed, class) ``` Täisarvuliste tulpade vahelised korrelatsiooniseosed ```{r } cor(andmed[, sapply(andmed, class)=="integer"], use="pairwise.complete.obs") ``` Seosed graafiliselt, aga sai vist veidi palju korraga. Samuti täisarvulised tulemused üksteise peal. ```{r fig.height=12, fig.width=12} pairs(andmed[, sapply(andmed, class)=="integer"]) ``` Puuduvate väärtuste loetelu tulpade kaupa ```{r } sapply(andmed, function(tulp){sum(is.na(tulp))}) ``` Sama joonisena ```{r } puuduvad=sapply(andmed, function(tulp){sum(is.na(tulp))}) barplot(puuduvad, las=3) ``` Kasvavana järjestatult ```{r } barplot(sort(puuduvad), las=3, ylim=c(0, max(puuduvad)+5), ylab="Puuduvate väärtuste arv tunnuses") ``` Kolme semestri keskmine tulemus lahkumispõhjuse kaupa ```{r } tapply((andmed$G1+andmed$G2+andmed$G3)/3, andmed$reason, mean, na.rm=TRUE) ``` Sama sapply abil. ```{r } sapply(unique(andmed$reason), function(tyyp){ tulbad= c("G1", "G2", "G3") if(!is.na(tyyp)){ arvud=na.omit(andmed[andmed$reason==tyyp, tulbad]) } else { arvud=na.omit(andmed[is.na(andmed$reason), tulbad]) } vastus=sum(arvud)/nrow(arvud)/length(tulbad) names(vastus)=tyyp vastus }) ``` Sisseloetavate andmete algvariant. Käsk sample võtab etteantud loetelust (TRUE, NA) etteantud tõenäosuste (0.9, 0.1) järgi väärtusi, kokku nõnda palju, kui funktsiooni parameetriks tulbas (x) väärtusi on. Parameeter replace=TRUE vajalik selle jaoks, et tohiks sama väärtust korduvalt võtta, muidu poleks kaheliikmelisest sisendist võimalik saada üle kahe tulemuse. Tulemuseks saadakse TRUE/NA-de rida. Kantsulg-operaatori puhul TRUE puhul tagastatakse x-kogumi vastav väärtus, NA puhul NA, mis siis jääbki tulemusse sisse. lapply väljastab listi (võtmed ja väärtused, iga tulp eraldi), as.data.frame paneb kõik selle jälle üldisesse ja arusaadavasse tabelisse kokku. ```{r } andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".") andmed <- as.data.frame(lapply(andmed, function(x) x[sample(c(TRUE, NA), prob = c(0.9, 0.1), size = length(x), replace = TRUE)])) head(andmed) class(andmed) ``` sapply puhul tundub, et jääb eraldi data.frame-ks tegemine ära, see aga tekitab probleeme tekstiliste tulpadega (jääb faktori number) ```{r } andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".") andmed <- sapply(andmed, function(x) x[sample(c(TRUE, NA), prob = c(0.9, 0.1), size = length(x), replace = TRUE)]) head(andmed) class(andmed) ``` Eraldi käskudena kirjutades saab ka juhuvalikuga võetud kohtadele NAd kirjutada. ```{r } andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".") andmed <- sapply(andmed, function(x) { x[round(runif(length(x)/10, 1, length(x)))]=NA x}) head(andmed) class(andmed) ``` Maatriksiks muutmata ```{r } andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".") for (tulp in names(andmed)){ andmed[round(runif(nrow(andmed)/10, 1, nrow(andmed))), tulp]=NA } head(andmed) class(andmed) ```