2. Frá tilraun til gagna

Mörg verk þarf að vinna frá því að niðurstöðum rannsóknar hefur verið safnað þar til að hægt er að framkvæma tölfræðiúrvinnslu á þeim niðurstöðum. Í þessum kafla verður gengið í gegnum þau helstu skref sem þarf að stíga á þeirri leið.

Við hefjum umfjöllunina á góðum ráðleggingum varðandi innslátt og skráningu gagnanna, sem er efni kafla 2.1. Í kafla 2.2 sýnum við hvernig gögnin eru lesin inn í R, með aðstoð skipunarinnar read.table(). Einnig sýnum við nokkrar handhægar skipanir til að búa til mælingar, þær eru c(), rep() og seq().

Eftir að gögn hafa verið lesið inn er mikilvægt að fá gróft yfirlit yfir gögnin til að tryggja að innlesturinn hafi gengið sem skildi. Til þess notum við skipanirnar View(), names(), head(), str(), length() og dim() sem við sjáum í kafla 2.2.

Mikilvægt atriði í meðhöndlun gagna er meðhöndlun mælinga sem vantar í gagnasafnið. Það er umfjöllunarefni kafla 2.4 þar sem við kynnumst skipununum is.na() og na.omit(). Í kafla 2.5 sjáum við svo leiðir til að velja tilteknar línur úr gagnatöflunni. Til þess notum við skipanirnar slice(), filter(), which() og grep().

Í kafla 2.6 sýnum við handhægar skipanir til að koma breytunum okkar á það form sem við viljum vinna með, þ.e.a.s. kóða þær. Mesta púðrið fer yfirleitt í að kóða flokkabreytur en einnig lýsum við því beita má vörpunum á talnabreytur og dagsetningar eru meðhöndlaðar. Þar koma við sögu skipanirnar factor(), levels(), cut(), as_date() og rename().

Síðast en ekki síst fjallar kafli 2.7 um handhægar leiðir til að umraða og umbreyta gagnatöflum. Skipunin select() hjálpar okkur að búa til minni gagnatöflur með færri breytum. Skipanirnar sort() og arrange() gera okkur kleift að raða gildum eftir línum og dálkum á meðan skipanirnar spread() og gather() varpað úr löngu sniði í vítt og öfugt. Að lokum gerir skipunin merge() okkur kleift að sameina tvær eða fleiri gagnatöflur.

2.1. Skráning gagna

Fyrsta ráðleggingin sem við viljum gefa varðandi skráningu gagna er að gæta þess að geyma ætíð frumeintak af mælingunum í annarri skrá áður en þið hefjist handa við nokkra úrvinnslu, þar á meðal að undirbúa lestur gagnanna inn í R. Bæði viljum við ekki eiga á hættu á að gera einhverjar óafturkræfar breytingar á mælingunum og eins gætum við viljað skrá hjá okkur ýmsar upplýsingar sem við notum ekki beint í tölfræðiúrvinnslunni en gætum viljað kanna síðar meir.

Gögn eru oftar en ekki skráð í einhvers konar töflureikni, til dæmis Excel, Numbers, LibreOffice eða Google Sheets, og miðum við umfjöllun kaflans við það. Við gerum ráð fyrir að við mælum margar breytur en höfum eingöngu eina mælingu á hverri breytu fyrir hvert viðfangsefni. Séu fleiri en ein mæling framkvæmd á hverju viðfangsefni þarf að velja á hvaða gagnasniði gögnin eru. Við ræðum slíkt stuttlega í kafla 2.7.

Eftirfarandi gátlisti spannar það helsta sem þarf að hafa í huga við skráningu gagna í töflureikni:

  1. Hefur hver breyta sinn dálk og hvert viðfangsefni sína línu?

    Gætið þess að allar mælingar á sama viðfangsefni séu í einni og sömu línunni og að allar mælingar á sömu breytu séu í einum og sama dálkinum.

2. Eru nokkrar óþarfa línur?

Skráin á að halda gagnatöfluna eina og ekkert annað. Efsta línan á að geyma nöfnin á breytunum, þar fyrir neðan koma mælingarnar á viðfangsefnunum. Ekkert annað á að vera í skránni.

3. Inniheldur skráin séríslenska stafi?

Séríslenskir stafir, svo sem þ, ð og æ, geta oft valdið usla þegar gögn eru flutt á milli tölva. Því borgar sig að forðast alla séríslenska stafi, hvort sem heldur í breytuheitum eða þeim gildum sem mælingarnar taka. Ritið þannig breytuna hæð heldur sem breytuna haed svo dæmi sé nefnt. Ef þið skráið ekki gögnin sjálf heldur fáið í hendur gögn sem innihalda séríslenska stafi þá má þó prófa að notast við skrána með séríslensku stöfunum og skipta þeim ekki út fyrr en við höfum séð að þeir valdi vandræðum.

4. Eru nokkur bil?

Það getur að sama skapi valdið vandræðum þegar breytuheiti eða gildi mælinga eru skráð með tveimur eða fleiri orðum. Það er hægt að komast hjá því með því að annað hvort leika sér með hástafi og lágstafi eða nota \(\_\) táknið. Þannig væri hægt að skrá breytuna fyrsta koma sem annað hvort sem fyrstaKoma eða fyrsta\_koma til dæmis.

5. Eru sömu útkomurnar skráðar á sama hátt?

Við þurfum alltaf að gæta þess að skilgreina nákvæmlega hvaða útkomur breyturnar okkar geta tekið og að skrá sömu útkomurnar á sama hátt. Að ja sé ekki stundum skráð sem Ja eða jafnvel ju. Stundum þvælast óþarfa auð tákn með í útkomuna sem valda vandræðum seinna meir. Oft getur borgað sig að kóða útkomurnar heldur með tölustöfum heldur en orðum.

6. Hefur hver breyta sitt nafn?

Pössum að engar tvær breytur hafi sama nafnið. Að það séu til dæmis ekki tveir dálkar sem bera heitið numer. Gætið þess að hafa breytuheiti lýsandi án þess að vera of löng.

7. Er fullt samræmi í því hvernig tölur eru skráðar?

Er „þrír komma fjórir“ ritað sem 3,4 eða 3.4 eða kannski beggja blands hér og þar í skjalinu?

8. Eru nokkrir punktar sem gætu valið misskilningi?

Notum eingöngu punkta til að aðgreina á milli heiltöluhluta og aukastafa en ekki til að gera þúsund og milljónir læsilegri. Á Íslandi er stærðin 3482 oft rituð sem 3.482 en fáum við eingöngu töluna 3.482 gefna er ekki ljóst hvort hún eigi við töluna „þrjú þúsund fjögur hundruð áttatíu og tveir“ eða „þrír komma fjórir átta tveir“.

Þegar við höfum gengið úr skugga um ofangreind atriði er tímabært að vista gögnin á forminu .csv. Nær allir ritlar geta vistað skrár á þessu formi. Þá þurfum við oftast að fara í File, Save as og velja svo comma seperated value, text csv eða eitthvað álíka eftir því hvert forritið er. Þessa .csv skrá köllum við gagnaskrá.

Oft koma einhverjir valmöguleikar upp með það hvernig breytur séu aðgreindar frá dálki til dálks. Við mælum með því að nota annað hvort tab eða semikommur en alls ekki kommur því þær gætu einnig verið notaðar til að aðgreina heiltöluhluta og tugabrot.

Flest forrit á Íslandi nota kommur til að aðgreina heiltöluhluta og tölustafi en R aðgreinir með punkti. Séu heiltöluhlutar og tugabrot aðskilin með kommu í .csv skránni okkar þurfum við að fara aðra af tveimur leiðum:

  1. Gefa R til kynna að kommur séu notaðar til að aðgreina milli heiltöluhluta og tugabrota. Það er stillingaratriði í aðferðinni read.table() sem við kynnumst hér að neðan.

  2. Opna .csv skrána í einföldum ritli eins og Notepad eða TextEdit. Fara svo yfir skjalið með find og replace og skipta öllum kommum út fyrir punkta. Gætið þess að vista skrána aftur á forminu .csv. Stundum er hægt að gera þetta beint í Excel eða Open Office.

Fyrst um sinn er einfaldast og þægilegast að vista gagnaskrárnar í sömu möppu og við geymum skipanaskrárnar. R gerir að vísu enga kröfu um það, R getur náð í skrár hvaðan sem er af tölvunni (við þurfum bara að vísa á réttan stað), en það einfaldar ykkur úrvinnslu þegar verkefnin eru ekki mjög stór og gagnasöfnin sem við vinnum með eru ekki mörg. Séum við hins vegar að vinna stærri verkefni með nokkrum gagnasöfnum borgar sig að hafa sérstaka undirmöppu sem geymir einvörðungu gögnin.

Nú fyrst er tímabært að lesa gögnin inn í R.

2.2. Innlestur gagna

2.2.1. Innlestur gagna

2.2.1.1. read.table()

Athugið

Inntak: nafn á gagnaskrá

Úttak: gagnatafla

Helstu stillingar: header, sep, dec, na.strings, stringsAsFactors


Á síðu bókarinnar má finna gagnaskránar konnun.csv, nyrripuls.tsv, kaupskra.csv og pokarotta.csv. Byrjið á því að vista þær í vinnumöppunni ykkar, þ.e.a.s. sömu möppu og þið geymið skipanaskrána ykkar. Þá má lesa þau inn í R með skipuninni:

konnun <- read.table("konnun.csv", header=TRUE, sep=",")

Fyrst tilgreinum við nafnið á skránni: konnun.csv. Þar á eftir gefum við ýmis konar stillingar, aðgreindar með kommum.

Þær stillingar sem við komum oft til með að nota eru:

  • header=TRUE: Að breytuheiti séu í efstu línu gagnaskráarinnar.

  • sep=”,”: Dálkar/breytur eru aðgreindir með kommu.

    Séu dálkar t.d. aðgreindir með tab eða ; skiptum við sep=”,” út fyrir sep=”\t” eða sep=";"

  • dec=”,”: Ef tugabrot og heiltöluhlutar eru aðgreind með kommu í stað punkts þarf að nota þessa stillingu.

  • na.strings: Tilgreinir hvaða tákn á að líta á sem vantaðar mælingar (t.d. 999, NA osfrv).

  • stringsAsFActors: Tilgreinir að strengjabreytur eigi ekki að vista sem flokkabreytur.

puls gögninn innihalda tab í stað kommu eða semíkommu og eru lesinn inn í R með:

puls <- read.table("nyrripuls.tsv", header=TRUE, sep="\t")

Það getur stundum verið auðveldara að nota:

2.2.1.2. read.csv()

Athugið

Inntak: nafn á gagnaskrá

Úttak: gagnatafla

Helstu stillingar: header, sep, dec, na.strings, stringsAsFactors, encoding

konnun <- read.csv("konnun.csv")
pokarotta <- read.csv("pokarotta.csv")

Við notum read.csv() þegar sep="," og notum read.csv2() þegar sep=";".

Um leið og við gefum skipunina höfum við lesið inn gögnin okkar og vistað sem gagnatöflu undir heitinu konnun. Við hefðum getað gefið töflunni hvaða heiti sem við viljum, hún hefði allt eins geta heitið gogn, tilraun1 eða hvað annað sem okkur dettur í hug . Það eina sem ekki má er að láta nöfn byrja á tölustaf. Það væri því ekki í lagi að gefa töflunni heitið 1tilraun.

kaupskra gagnasettið er að finna á https://fasteignaskra.is/gogn/grunngogn-til-nidurhals/kaupskra-fasteigna/. Hlaðið skránni niður og opnið með read_csv() eða notið

kaupskra <- read_csv2("https://www.skra.is/library/Skrar/kaupskra/kaupskra.csv",
locale = locale(encoding = "ISO8859-1"))

Ef við sláum

konnun

inn í keyrslugluggann birtist svo öll taflan. Gætið ykkar að ef gagnataflan er mjög stór fyllir hún fljótt marga skjái svo þetta er ekki góð leið til að fá yfirlit yfir gögnin. Betra er að nota skipanirnar s.s. head() og str() sem við fjöllum um hér fyrir neðan.

Þegar við höfum lesið gögn inn sem töflu getum við hæglega „dregið“ eina og eina breytu út úr töflunni, skoðað nánar og jafnvel breytt. Viljum við t.d. ná í breytuna haed úr gagnatöflunni konnun gerum við það með:

konnun$haed

2.2.1.3. c()

Athugið

Inntak: gildi vigurs

Úttak: vigur


Þegar við vinnum með lítil gagnasöfn eða fáar mælingar getur oft verið hentugt að skrá þær beint inn í R, í stað þess að lesa gögnin úr .csv skrá. Til þess höfum við skipunina c(). Þannig býr skipunin

postnumer <- c(170,107,110, 101,105,107,111,108,104,101)

til vigurinn postnumer sem inniheldur 10 mælingar á póstnúmerum. Röðun póstnúmera í vigrinum er í þeirri röð sem þær eru slegnar:

postnumer
##  [1] 170 107 110 101 105 107 111 108 104 101

2.2.1.4. seq()

Athugið

Inntak: upphafs- og endagildi

Úttak: vigur

Helstu stillingar: by


Skipunin seq() er sérlega handhæg til að búa til talnarunur. Algengast er að mata hana með tveimur heiltölum og þá skilar hún vigri með öllum heiltölum á því bili. Einnig má hafa styttra eða lengra bil á milli talnanna í vigrinum, með stillingunni by tilgreinum við hvert bilið á að vera á milli talnanna. Hér eru tvö dæmi:

seq(3,7)
## [1] 3 4 5 6 7
seq(3,7, by=0.5)
## [1] 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0

Einnig er hægt að búa til runur af heiltölum með einföldum hætti með tvípunkti:

3:7
## [1] 3 4 5 6 7

2.2.1.5. rep()

Athugið

Inntak: gildi sem á að endurtaka

Úttak: vigur

Helstu stillingar: each


Önnur þægileg skipun er rep(). Með henni getum við búið til vigra þar sem sömu gildin eru endurtekin með kerfisbundnum hætti. Skipunin er mötuð með gildi eða vigri sem á að endurtaka og hversu oft vigurinn skal endurtekinn. Skipunin hér að neðan endurtekur vigurinn \(1, 2, 3\) fjórum sinnum.

rep(1:3,4)
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3

Einnig er hægt að gefa stillinguna each og þá er hvert stak í upphaflega vigrinum endurtekið:

rep(1:3,each=4)
##  [1] 1 1 1 1 2 2 2 2 3 3 3 3

2.2.2. Staðsetning skráa\(^\ast\)

Ein af stillingunum í read.table, file=, segir til um staðsetningu skráarinnar sem lesin er inn. Ef skráin er staðsett í vinnumöppu sem skilgreind er í R-setunni þá er read.table einfaldlega mötuð með nafninu á skránni. Hins vegar ef skráin er staðsett annars staðar flækist málið lítið eitt.

Mynd

Viljum við t.d. lesa Gagnaskrá_1 inn í R gefum við skipunina:

dat <- read.table(file = 'Gagnaskrá_1')

Til þess að lesa Gagnaskrá_3 þurfum við að bæta við nafninu á möppunni sem hún er í, þ.e.a.s. Gagnamappa_1:

dat <- read.table(file = 'Gagnamappa_1/Gagnaskrá_3')

Til þess að lesa inn Gagnaskrá_2 er hægt bakka upp í yfirmöppuna með því að vísa í hana með „..“ og svo fara í Gagnamöppu_2:

dat <- read.table(file = '../Gagnamappa_2/Gagnaskrá_2')

Skipunin að ofan vísar afstætt í Gagnaskrá_2. Einnig er hægt að víst algilt á skránna. Sé yfirmappann staðsett sem fyrsta mappa á stýrikerfisdisk má lesa skránna inn svona fyrir linux/MacOsX

dat <- read.table(file = '/Yfirmappa/Gagnamappa_2/Gagnaskrá_2')

og fyrir Windows (að því gefnu að stýrikerfis sé á c drifi):

dat <- read.table(file = 'c:/Yfirmappa/Gagnamappa_2/Gagnaskrá_2')

2.3. Gróft yfirlit gagna

2.3.1. Gróft yfirlit gagna

Eftir að gögnin hafa verið lesin inn er skynsamlegt að kanna að innlesturinn hafi gengið sem skyldi. Sé unnið í RStudio má smella á nafnið á gagnatöflunni í glugganum í efra hægra horninu en þá opnast gögnin á töfluformi. Til þess má einnig nota skipunina View().

Skipunin read.table() skráir sérhverja breytu hjá sér ýmist sem flokkabreytu (factor) eða talnabreytu (num eða int). Breytur sem innihalda eingöngu tölur eru sjálfkrafa vistaðar sem talnabreytur. Ef þær innihalda bara heiltölur eru þær vistaðar sem int en ef þær innihalda tugabrot eru þær vistaðar sem num. Það skiptir engu máli í úrvinnslunni hvort þær eru vistaðar sem int eða num.

Algengt er að notaðir séu talnakóðar fyrir gildi á flokkabreytum. Dæmi um þetta er að nota gildið 1 ef samningur er ónothæfur og 0 ef samningurinn er nothæfur í kaupskrá í breytunni onothaefur_samningur. Þar sem breytan inniheldur eingöngu tölur er onothaefur_samningur skilgreind sem talnabreyta eftir innlestur í R. Áður en úrvinnsla hefst þarf að breyta talnabreytunni í flokkabreytu (sjá kafla 2.6 ). Það getur einnig gerst að talnabreytur séu ranglega vistaðar sem flokkabreytur og getur það t.d. gerst þegar einhverjar mælingar á breytunni innihalda bókstafi eða þegar ekki er rétt tilgreint hvernig tugabrot eru aðskilin. Þetta þarf allt að laga áður en úrvinnsla hefst.

2.3.1.1. View()

Athugið

Inntak: nafn á gagnatöflu

Úttak: gögnin birtast á töfluformi


R lítur sjálfkrafa á hvern dálk úr gagnaskrá sem mælingu á einni breytu. Skipunin names() skilar nöfnunum á öllum breytum sem eru geymdar í gagnatöflu.

2.3.1.2. names()

Athugið

Inntak: nafn á gagnatöflu

Úttak: nöfn breytanna í gagnatöflunni skrifaðar út


Þannig gefur skipunin

names(konnun)
##  [1] "is"              "ferdatimi_skoli"  "styrikerfi_simi" "ferdamati_skoli"
##  [5] "systkini_fjoldi" "dyr"              "feministi"       "staerdfraedi_gaman"
##  [9] "smjor_kostar"    "napoleon_faeddur" "stefnumot"       "messi_staerd"
##  [13] "kosid"

nöfnin á öllum þeim breytum sem tilheyra gagnatöflunni dat. nöfnin á öllum þeim breytum sem tilheyra gagnatöflunni dat.

2.3.1.4. str()

Athugið

Inntak: nafn á gagnatöflu

Úttak: samantektir fyrir breyturnar


Önnur góð leið til að fá fljótt yfirlit yfir breytur gagnatöflunnar er að nota skipunina str(). Hún sýnir okkur á hvaða formi R skráir hvaða breytu og gefur einnig stutt yfirlit yfir það á hvaða bili mælingarnar liggja. Í okkar tilviki væri skipunin:

str(konnun)
## 'data.frame':     201 obs. of  13 variables:
##  $ is                : chr [1:201] "Jarðaberja" "Vanilla" "Súkkulaði" "Jarðaberja" ...
## $ ferdatimi_skoli   : num [1:201] 15 20 8 12 15 42 20 7 15 25 ...
## $ styrikerfi_simi   : chr [1:201] "Android" "iOS" "iOS" "Android" ...
## $ ferdamati_skoli   : chr [1:201] "Með einkabíl" "Með einkabíl" "Með einkabíl" "Gangandi / skokkandi" ...
## $ systkini_fjoldi   : num [1:201] 1 2 3 2 2 5 2 3 2 2 ...
## $ dyr               : chr [1:201] "Hunda" "Hunda" "Hunda" "Ketti" ...
## $ feministi         : chr [1:201] "Rétt" "Rétt" "Rangt" "Rétt" ...
## $ staerdfraedi_gaman: int [1:201] 9 8 7 3 9 7 7 7 9 8 ...
## $ smjor_kostar      : num [1:201] 750 700 800 700 1100 437 1490 279 1400 1200 ...
## $ napoleon_faeddur  : num [1:201] 1750 1784 1778 1870 1779 ...
## $ stefnumot         : chr [1:201] "Á kaffihús" "Á ísrúnt" "Á ísrúnt" "Á ísrúnt" ...
## $ messi_staerd      : num [1:201] 170 168 170 160 169 174 169 179 170 170 ...
## $ kosid             : chr [1:201] "Rétt" "Rangt" "Rangt" "Rétt" ...

Við mælum eindregið með að nota ávalt str() skipunina til að kanna hvort allar breytur gagnatöflunnar séu á réttu formi eftir innlestur gagnanna.

2.3.1.5. length()

Athugið

Inntak: nafn á vigri

Úttak: lengd vigursins


Skipunin length() gefur okkur lengd þess vigurs (breytu) sem hún er mötuð með, þ.e.a.s. hún segir okkur hversu margar mælingar eru geymdar í tilteknum vigri. Í dæminu að ofan gefur skipunin

length(konnun$ferdatimi_skoli)
## [1] 201

útkomuna \(201\). Þ.e.a.s. það eru \(201\) mælingar á ferðatíma í skóla geymdar í breytunni ferdatimi_skoli í gagnatöflunni konnun.

2.3.1.6. dim()

Athugið

Inntak: nafn á gagnatöflu/fylki

Úttak: vídd gagnatöflunnar/fylkisins


Skipunin dim() skilar fjölda lína og fjölda dálka í gagnatöflu, þ.e.a.s. hversu margar mælingar og breytur eru í töflunni.

2.4. Vöntun mælinga

2.4.1. Vöntun mælinga

Við vinnum afar oft með gagnatöflur þar sem það vantar mælingar á einhverjum breytum hjá sumum viðfangsefnum. R leysir úr því með því að gefa þeim mælingum gildið NA sem stendur einfaldlega fyrir „not available“, þ.e. mælinguna vantar. Í þessum undirkafla munum við kynnast skipununum is.na(), sem hjálpar okkur að finna mælingar sem vantar og na.omit() sem fjarlægir mælingar sem vantar.

Margar þeirra R-skipana sem þið munuð kynnast seinna meir gefa villu ef vigurinn sem við mötum þær með inniheldur NA gildi. Þar sem stillingarnar eru ólíkar eftir því hverjar skipanirnar eru munum við tilgreina þær með umfjöllun hverrar og einnar skipunar en ekki hér í þessum kafla.

2.4.1.1. is.na()

Athugið

Inntak: vigur eða fylki

Úttak: vigur eða fylki


Það er alltaf gott að kanna hvort það séu einhver NA gildi í breytunum okkar áður en við hefjum úrvinnslu og hversu mörg þau eru. Til þess er gott að nota skipunina is.na() en hún segir okkur hvort mæling sé NA eða ekki. Sjáið sem dæmi:

fjoldi <- c(2,5,3,NA,1)
is.na(fjoldi)
## [1] FALSE FALSE FALSE  TRUE FALSE

Við mötuðum skipunina is.na() með vigri með fimm mælingum. Út kemur vigur með fimm mælingum, þar sem stendur FALSE þar sem við höfum mælingu en TRUE þar sem við höfum NA gildi, sem í þessu tilviki er í fjórða sæti vigursins.

Það má líka mata gagnatöflu í is.na() og þá gefur skipunin töflu af sömu stærð sem inniheldur FALSE á hverjum þeim stað sem mæling er til staðar en TRUE þar sem NA gildi eru.

2.4.1.2. na.omit()

Athugið

Inntak: vigur eða fylki

Úttak: vigur eða fylki


Önnur skipun, náskyld is.na(), er na.omit(). Hún getur bæði verið mötuð á vigri og gagnatöflu. Sé hún mötuð á vigri skilar hún samsvarandi vigri þar sem búið er að fjarlægja NA gildi. Sé hún mötuð með gagnatöflu skilar hún nýrri gagnatöflu með viðfangsefnum sem enga mælingu vantar hjá.

Skipunin

konnun2 <-na.omit(konnun)

smíðar gagnatöfluna konnun2 sem inniheldur aðeins einstaklinga sem enga mælingu vantar hjá. Gætið ykkar að við viljum afar sjaldan eyða út öllum einstaklingum í gagnatöflu sem vantar einhverja mælingu hjá. Segjum sem sem dæmi að það vanti margar mælingar á breytunni smjor_kostar í gagnasafninu okkar en í raun höfum við mestan áhuga á að rannsaka breytuna messi_staerd. Með því að henda út öllum einstaklingum sem vantar mælingar á breytunni smjor_kostar erum við búin að henda út mælingum sem við gætum notað í rannsóknum okkar á hæð Messi.

2.4.1.3. Óraunhæfum mælingum breytt í NA

Stundum viljum við að mælingarnar okkar séu á ákveðnu bili. Þá getum við breytt óraunhæfu mælingunum í NA gildi. Skoðum t.d. breytuna napoleon_faeddur þar sem nemendur giskuðu hvenær þau héldu að Napóleon Bonaparte hafi fæðst. Viljum að ágiskanirnar séu á bilinu 1500-1900. Við breytum þá óraunhæfum gildum í NA með eftirfarandi skipun:

konnun$napoleon_faeddur[konnun$<1500|konnun$napoleon_faeddur>1900]<-NA

2.5. Ákveðin gildi valin úr gagnatöflu

2.5.1. Ákveðin gildi valin úr gagnatöflu

Mikilvægur hluti af meðhöndlun gagna er að velja út ákveðinn hluta gagnatöflunnar okkar. Eitt dæmi er ef við viljum skipta gögnunum okkar upp í lög (e. strata) og annað er þegar við viljum búa til nýjar breytur út frá þeim mælingum sem fyrir eru. Í þessum undirkafla munum við fjalla um margar öflugar leiðir til að velja mælingar úr vigrum eða gagnatöflum. Margar frábærar leiðir til slíks tilheyra pakkanum dplyr() og munum við kynnast nokkrum þeirra hér á eftir. Þá þarf að gæta að pakkinn sé aðgengilegur í vinnulotunni okkar áður en við notum aðferðirnar.

Nær allar aðferðir til að velja hluta af gögnum krefjast notkun samanburðarvirkja. Sá einfaldasti þeirra er == en hann notum við til að kanna hvort vigur innihaldi eitthvað tiltekið gildi. Þá ritum við vigurinn fyrst, þá == og loks tiltekna gildið. Skipunin skilar jafnlöngum vigri og þeim sem við mötuðum í skipunina sem inniheldur eingöngu TRUE eða FALSE gildi. Sé ákveðna gildið í tilteknu sæti vigursins inniheldur útkomuvigurinn TRUE í tilsvarandi sæti, en FALSE annars. Í skipuninni hér að neðan skoðum við vigurinn kaupskra$onothaefur_samningur sem inniheldur hvort samningur sé nothæfur eða ekki.

kaupskra$onothaefur_samningur == 0
##   [1] TRUE TRUE  FALSE  FALSE  TRUE  FALSE  FALSE FALSE  FALSE FALSE FALSE
##  [12] FALSE  TRUE TRUE  TRUE  TRUE TRUE TRUE  TRUE TRUE  TRUE  TRUE
##  [23] TRUE  FALSE  TRUE  TRUE FALSE  FALSE FALSE  FALSE FALSE  TRUE FALSE
....

Ekki gleyma því að setja gæsalappir utanum gildi breytunnar eigi það við. Þær þurfum við alltaf að setja þegar gildið sem við viljum kanna er kóðað með orði en ekki tölustaf.

Berið útkomuvigurinn saman við vigurinn

kaupskra$onothaefur_samningur
##  [1] 0 0 1 1 0 1 1 1 1 1 1 0
##  [13] 0 0 0 0 0 0 0 0 0 0 0 1
##  [25] 0 0 1 1 1 1 1 0 0 0 0 0
....

þannig sjáið þið að útkomuvigurinn inniheldur FALSE alls staðar þar sem kaupskra$onothaefur_samningur hefur gildið 1 en TRUE annars. Samanburðarvirkinn er mikið notaður við lagskiptingu gagna.

Líkt og við notum == getum við einnig notað aðra samanburðarvirkja:

>

stærri en

>=

stærri eða jafnt og

<

minni en

<=

minni eða jafnt og

!=

ekki jafnt og

&

og

|

eða

Efstu virkjarnir fjórir skýra sig að mestu leyti sjálfir. Ef við viljum t.d. búa til nýja gagnatöflu konnunT sem inniheldur aðeins einstaklinga sem halda að Messi sé hærri en 170 cm gerum við það með:

konnunT <- konnun[konnun$messi_staerd > 170, ]

eða

konnunT <- filter(konnun$messi_staerd > 170)

Skoðum filter() skipunina betur í %s <s.Ákveðin gildi valin úr gagnatöflu> Hvað varðar neðri virkjana tvo, þá er virkinn \(\&\) mataður með tveimur skilyrðum og skilar TRUE eingöngu ef bæði skilyrðin eru uppfyllt. Virkinn \(|\) er sömuleiðis mataður með tveimur skilyrðum en það nægir að eingöngu annað þeirra séu uppfyllt til að hann skili TRUE.

Síðast en ekki síst er virkinn %in% mikið notaður. Hann má nota til að spyrja hvort gildi mælingar sé meðal einhverra annarra gildi. T.d. skilar skipunin:

konnun$systkini_fjoldi%in%c(0,3,7)
## [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
## [9] FALSE FALSE  TRUE FALSE TRUE FALSE FALSE FALSE
## [17]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
....

gildinu TRUE ef breytan systkini_fjoldi tekur eitthvert gildanna 0, 3 eða 7, en FALSE annars.

2.5.1.1. slice()

Athugið

Inntak: nafn á gagnatöflu og vigur

Úttak: gagnatafla

Pakki: dplyr


Fyrsta aðferðin sem við kynnumst úr dplyr er slice(). Hana notum við til að velja ákveðnar línur út gagnatöflu. Ef við viljum t.d. geyma mælingar á fyrstu 10 viðfangsefnunum í konnun gagnatöflunni í nýrri gagnatöflu getum við gert það með:

konnun.first<-slice(konnun,1:10)

2.5.1.2. filter()

Athugið

Inntak: nafn á gagnatöflu og nöfn á breytum ásamt skilyrðum

Úttak: gagnatafla

Pakki: dplyr


Næsta skipun er filter(). Hana notum við til að velja aðeins hluta eða lag af gagnatöflunni okkar. Við mötum hana með nafninu á gagnatöflunni sem við viljum lagskipta ásamt skilyrðum sem það lag sem við ætlum að draga út þarf að uppfylla. Við getum t.d. búið til nýja gagnatöflu sem inniheldur aðeins þá sem eiga engin systkini með:

engin_systkini<-filter(konnun, systkini_fjoldi==0)

Ef við viljum skoða gögn þeirra sem finnst jarðaberjaís bestur og kunna betur við hunda heldur en ketti (takið eftir að hér er ekki búin til ný gagnatafla):

filter(konnun, is=="Jarðaberja", dyr=="Hunda")
##    is          ferdatimi_skoli   styrikerfi_simi   ferdamati_skoli
## 1  Jarðaberja  15                Android           Með einkabíl
## 2  Jarðaberja  7                 Android           Gangandi/ skokkandi
##    systkini_fjoldi   dyr      feministi   staerdfraedi_gaman   smjor_kostar
## 1  1                 Hunda    Rétt        9                    750
## 2  3                 Hunda    Rétt        7                    279
##    napoleon_faeddur  stefnumot      messi_staerd   kosid
## 1  1750              Á kaffihús     170            Rétt
## 2  1551              Á ísrúnt       179            Rétt
....

Einnig er, eins og við sáum hér á undan, hægt að nota hornklofa ([ ]) til að velja hluta af gagnatöflu. Þá mötum við hornklofann með tveimur vigrum af vísum sem við aðgreinum með kommu. Fyrst kemur vísavigurinn sem tilgreinir hvaða viðfangsefni (línur) við viljum velja síðan kemur vísavigurinn sem tilgreinir hvaða breytur (dálka) við viljum velja. Við númerum viðfangsefni frá efsta viðfangsefninu til þess neðsta (þ.e.a.s. efsta línan er númer eitt), en breyturnar frá vinstri til hægri (þ.e.a.s. breytan lengst til vinstri er númer eitt).

Ef við viljum skoða hver mælingin á breytu 2 (ferdatimi_skoli) á viðfangsefni 46 er í gagnatöflunni okkar konnun gefum við skipunina:

konnun[46,2]
## [1] 20

Ef við sleppum fyrri vísavigrinum fáum við mælingar á öllum viðfangsefnum fyrir breyturnar sem við tilgreinum í seinni vigrinum. Þannig gefur skipunin

konnun[,2]

mælingarnar á ferðatíma í skóla fyrir öll viðfangsefnin. Ef við sleppum seinni vísavigrinum fáum við mælingar á öllum breytum fyrir viðfangsefnin sem við tilgreinum í fyrri vigrinum. Þannig gefur skipunin

konnun[c(46,52),]
##     is         ferdatimi_skoli   styrikerfi_simi   ferdamati_skoli
## 46  Vanilla    20                iOS               Með einkabíl
## 52  Vanilla    13                iOS               Með einkabíl
##     systkini_fjoldi   dyr      feministi     staerdfraedi_gaman
## 46  7                 Ketti    Rétt          7
## 52  3                 Hunda    Rétt          9
##     smjor_kostar    napoleon_faeddur  stefnumot       messi_staerd   kosid
## 46  549             1769              Í bíó           171            Rangt
## 52  359             1120              Í fjallgöngu    171            Rétt

allar mælingar fyrir viðfangsefni númer 46 og 52.

Að lokum getum við notað mínus til að skoða mælingar í gagnatöflu fyrir öll viðfangsefni nema einhver tiltekin, eða allar breytur nema einhverjar tilteknar.

konnun[-c(46,52), -2]

gefur mælingar fyrir öll viðfangsefni nema númer 46 og 52 og allar breytur nema þá aðra.

2.5.1.3. which()

Athugið

Inntak: skilyrði

Úttak: vigur eða fylki með vísum í stök sem uppfylla skilyrðið/in

Helstu stillingar: arr.ind


Að lokum viljum við nefna tvær aðferðir sem fylgja grunnpakka R. which() aðferðin er einstaklega gagnleg og gefur hún okkur vísa á gildi í vigri, gagnatöflu eða fylki sem uppfylla ákveðin skilyrði. Við getum t.d. kannað hvaða einstaklingar halda að Messi sé hærri en 180 cm í konnun gögnunum okkar:

which(konnun$messi_staerd>180)
##  [1]   29   64    77    130    136     142   168   195

Ef við mötum which() með tvívíðum hlut (fylki) og notum arr.ind stillinguna skilar aðferðin númerinu á línunni og á dálkinum sem skilyrðunum er uppfyllt.

2.5.1.4. grep()

Athugið

Inntak: nafn á skilyrði og nafn á vigri

Úttak: gildi eða vísar fyrir gildi

Helstu stillingar: value


Seinni skipunin er grep(). Hún getur verið einstaklega handhæg ef við viljum sem dæmi búa til flokkabreytur út frá textastrengjum. Eftirfarandi skipun finnur til dæmis vísi allra þeirra ferdamati_skoli sem innihalda textastrenginn skokkandi.

grep("skokkandi", konnun$ferdamati_skoli)
## [1]  4   8   12  13  24  25  57  59  67
## [10] 77  93  96  97  100 117 119 122 130
## [19] 131 132 133 136 139 142 147 148 158
## [28] 160 162 168 169 184 188 196
....

Ef við gefum stillinguna value=TRUE fáum við mælingarnar sem pössuðu við leitarskilyrðið en ekki bara vísa þeirra:

grep("skokkandi", konnun$ferdamati_skoli, value=TRUE)
##   [1] "Gangandi / skokkandi" "Gangandi / skokkandi" "Gangandi / skokkandi"
##   [4] "Gangandi / skokkandi" "Gangandi / skokkandi" "Gangandi / skokkandi"
##   [7] "Gangandi / skokkandi" "Gangandi / skokkandi" "Gangandi / skokkandi"
....

2.6. Kóðun breyta

Yfirleitt þarf að vinna talsvert með breyturnar í gagnatöflunni áður en tölfræðileg úrvinnsla getur hafist. Bæði þarf oft að búa til nýjar, afleiddar breytur, en einnig að gæta þess að breytur séu vistaðar á réttu sniði og jafnvel að beita vörpunum af talnabreytum. Slíkt köllum við einu orði að kóða breytur. Algengustu kóðanirnar sem við framkvæmum eru að:

  1. Kóða breytur sem voru skráðar sem tölur sem flokkabreytur og skilgreina gildi flokkanna með skipununum factor() og levels().

  2. Skipta talnabreytum upp í bil og búa til flokkabreytur út frá þeim með skipuninni cut().

  3. Sameina tvo eða fleiri flokka í flokkabreytu.

  4. Kóða strengi eða flokkabreytur sem dagsetningar með as.Date().

  5. Búa til breytu með því að leita eftir textabútum í strengjum með grep().

  6. Gefa breytum þægilegri heiti með skipuninni rename().

  7. Beita vörpunum á talnabreytur.

Við förum nánar í þessi atriði hér fyrir neðan.

2.6.1. A: Flokkabreytur skilgreindar

2.6.1.1. factor()

Athugið

Inntak: nafn talnabreytu

Úttak: flokkabreyta

Helstu stillingar: levels, labels, ordered


Flokkabreytur eru oft kóðaðar með tölum og þá mun R vista þær sem talnabreytur þegar gögnin eru lesin inn. Slíkt á t.d. við breytuna onothaefur_samningur í gagnatöflunni kaupskra. Við notum skipunina factor() til að gefa R til kynna að breyta sé flokkabreyta. Ef við viljum leiðrétta hvernig breytan onothaefur_samningur er vistuð í gagnatöflunni sjálfri notum við skipunina:

kaupskra$onothaefur_samningur <- factor(kaupskra$onothaefur_samningur)

Takið eftir því að hér að ofan yfirskrifum við gömlu talnabreytuna onothaefur_samningur með nýju flokkabreytunni (þær bera sama nafn). Í þessu tilviki er það einmitt það sem við viljum gera. Það gæti þó komið fyrir að við viljum halda í gömlu talnabreytuna en þá þurfum við að búa til nýja breytu í stað þess að skrifa yfir þá gömlu. Til að gera það þurfum við að gæta að nota annað nafn en á upphaflegu talnabreytunni. Með eftirfarandi skipun búum við til nýja breytu onothaefur_samningur2 í gagnatöflunni kaupskra.

kaupskra$onothaefur_samningur2 <- factor(kaupskra$onothaefur_samningur)

Hefðum við aðeins keyrt seinni factor() skipunina ættum við til talnabreytuna onothaefur_samningur í gagnatöflunni ásamt flokkabreytunni onothaefur_samningur2.

R meðhöndlar flokkabreytur á annan hátt en talnabreytur, réttilega. Því er mikilvægt að breytur séu ætíð rétt skráðar svo að til að mynda gröf af þeim breytum séu rétt teiknuð og margt fleira.

2.6.1.2. levels()

Athugið

Inntak: nafn á flokkabreytu

Úttak: nöfn á flokkum flokkabreytunnar


Hægt er að nota levels() skipunina til að endurskýra nöfn á flokkum í flokkabreytu. Viljum við endurskýra nöfnin á flokkunum í breytunni onothaefur_samningur er ágætt að byrja á að keyra skipunina

levels(kaupskra$onothaefur_samningur)
## [1] "0" "1"

því hún skilar okkur núverandi nöfnum. Viljum við breyta nöfnunum á flokkunum í Nothæfur samningur og Ónothæfur samningur gerum við það með:

levels(kaupskra$onothaefur_samningur)<-c("Nothæfur samningur","Ónothæfur samningur")

Hér þarf að passa að röðunin sé rétt miðað við gömlu heitin, annars breytum við öllum nothæfu samningunum í ónothæfa og öfugt.

2.6.2. B: Talnabreytum skipt upp í bil

2.6.2.1. cut()

Athugið

Inntak: talnabreyta

Úttak: flokkabreyta

Helstu stillingar: breaks, include.lowest, right


Stundum viljum við skipta gildum talnabreytu upp í flokka. cut() aðferðin tekur inn talnabreytu, skiptir gildum hennar upp í flokka sem notandinn skilgreinir og skilar svo flokkabreytu. Við mötum aðferðina með mörkunum á flokkunum en það má gera á nokkra vegu með hjálp include.lowest og right stillingunum. Skoðið help(cut) til að kanna nánar hvernig aðferðin virkar.

Búum nú til flokkabreytu úr talnabreytunni systkini_fjoldi. Við ætlum að skipta viðfangsefnunum upp í þrjá flokka, þau sem eiga engin systkini, þau sem eiga nokkur systkini (1-2) og þau sem eiga mörg systkini (\(>\) 3 ). Gætið þess að skýra nýju breytuna eitthvað annað en systkini_fjoldi svo við yfirskrifum ekki talnabreytuna heldur búum þess í stað til nýja breytu. Við mötum aðferðina með nafninu á talnabreytunni systkini_fjoldi og mörkunum á flokkunum. Ætlum við að tilgreina vinstri mörkin á flokkunum okkar (lægri mörkin) notum við right=F stillinguna. Við mötum því aðferðina með 0,1,3 (neðri mörkin á flokkunum okkar) en þurfum svo að gefa efra mark á síðasta flokknum. Þetta þarf að vera gildi sem er a.m.k. einu gildi hærra en hæsta gildið sem talnabreytan tekur. Hér notum við gildið 15 (fallegra væri að nota max(konnun$systkini_fjoldi)+1):

konnun$systkini_fjoldi_stig<-cut(konnun$systkini_fjoldi,c(0,1,3,15),right=F)

Hér sjáum við hversu margir verða í hverjum flokki:

table(konnun$systkini_fjoldi_stig)
##
##   [0,1)   [1,3) [3,15)
##      3     123     75

Við getum svo notað levels() skipunina til að endurskýra flokkana:

levels(konnun$systkini_fjoldi_stig)<-c("Engin","Nokkur","Mörg")
table(konnun$systkini_fjoldi_stig)
##
##    Engin    Nokkur   Mörg
##    3        123      75

2.6.3. C: Flokkar sameinaðir

Afar oft viljum við sameina tvo eða fleiri flokka flokkabreytu. Í R framkvæmum við það með því að gefa tveimur eða fleiri flokkum sama heitið með skipuninni levels(). Segjum að við viljum sérstaklega kanna mun á þeim nemendum sem koma í skólann með ökutæki í samanburði við alla aðra nemendur. Þá væri sniðugt að hafa nýja breytu ferdamati_skoli_okutaeki sem tekur bara tvö gildi: med_okutaeki og ekki_med_okutaeki.

Þegar við búum til breytuna ætlum við að sameina flokkana Með einkabíl og Með strætó undir nafninu med_okutaeki og sameinum flokkana Á hjóli/ rafhlaupahjóli, Gangandi/ skokkandi og Á annan hátt. Búum fyrst til afrit af breytunni og sjáum í hvaða röð flokkarnir eru taldir upp:

konnun$ferdamati_skoli_okutaeki <- konnun$ferdatimi_skoli
levels(konnun$ferdamati_skoli_okutaeki)
## [1] "Á annan hátt"  "Á hjóli/ rafhlaupahjóli"  "Gangandi/ skokkandi"
## [4] "Með einkabíl"  "Með strætó"

Flokkarnir sem við ætlum að sameina eru fyrstu þrír flokkarnir sem eru taldir upp. Því skrifum við ekki_med_okutaeki í fyrstu þrjú sætin en með_okutakei í síðustu tv- sætin.

levels(konnun$ferdamati_skoli_okutaeki) <-
c('ekki_med_okutaeki','ekki_med_okutaeki','ekki_med_okutaeki', 'med_okutaeki', 'med_okutaeki')

Nýja sameinaða breytan hefur eingöngu tvo flokka:

str(konnun$ferdamati_skoli_okutaeki)
##  Factor w/ 2 levels "ekki_med_okutaeki","med_okutaeki
": 2 2 2 1 2 2 1 2 2 1 ...

Einnig má gera þetta með að nota fct_recode() skipunina úr forcats pakkanum. Hana má nota svona:

byrjum að sækja forcats pakkann

library(forcats)

Búum fyrst til nýjan flokk sem er afrit að ferdamati_skoli

konnun$ferdamati_skoli_okutaeki <- konnun$ferdatimi_skoli

Búum svo til nýju flokkana

konnun$ferdamati_skoli_okutaeki<- fct_recode(konnun$ferdamati_skoli_okutaeki,
"ekki_med_okutaeki" = "Á hjóli / rafhlaupahjóli","ekki_med_okutaeki"
= "Gangandi / skokkandi", "ekki_med_okutaeki" = "Á annan hátt",
"med_okutaeki" = "Með einkabíl", "med_okutaeki" = "Með strætó")

2.6.4. D: Dagsetningabreytur skilgreindar

2.6.4.1. as_date()

Athugið

Inntak: nafn bókstafabreytu

Úttak: dagsetningabreyta

Helstu stillingar: format


Það er mjög algengt að einhverjar breytanna okkar geymi dagsetningar. Yfirleitt verða þær sjálfkrafa lesnar inn sem flokkabreytur en við getum sjaldnast unnið með þær á því formi. Þess í stað vistum við þær sem dagsetningar með skipuninni as_date(). Með stillingunni format tilgreinum við hvernig dagsetningarnar eru skráðar. Kemur ártalið fyrst, svo mánuðurinn og svo dagurinn eða jafnvel öfugt? Eru dagar og mánuðir aðgreindir með punkti eða bandstriki? Allt það má tilgreina með auðveldum hætti og má sjá öll möguleg snið með því að skoða:

help("lubridate")

Segjum að við séum að vinna með gagnasettið afmaeli sem samanstendur af nöfnum og afmælisdögum. Í gagnasafninu kemur fyrst dagur, svo mánuður og þá fjögurra bókstafa ár, allt aðskilið með punkti. Því gefum við stillinguna format=’%d.%m.%Y’. Einnig vistaðist dagsetningin sem flokkabreyta við innlestur (þar sem hún inniheldur ekki bara tölur, heldur líka punkta). Því þarf að mata as.Date() með as.character(afmaeli$dagsetning), skipun sem breytir flokkabreytu í orðabreytu.

afmaeli$dagsetning <- as.Date(as.character(afmaeli$dagsetning), format='%d.%m.%Y' )

Nú eru dagsetningarnar komnar á rétt form:

str(afmaeli)
## 'data.frame':    37 obs. of  2 variables:
##  $ nafn    : Factor  "Margrét","Dagur" ...
##  $ dagsetning  : Date, format: "2003-01-11" "2005-10-05" ...

2.6.5. E: Leitað eftir textastrengjum

Stundum eru sumar breyturnar okkar langir textastrengir sem geyma ýmsar upplýsingar en við viljum draga tilteknar upplýsingar út úr strengjunum og nota til að búa til breytur. Þá kemur skipunin grep(), sem við sáum í kassa 2.5.1.4, að góðum notum. Ef við viljum sem dæmi búa til nýja breytu, ibud sem geymir hvort hús sé íbúðarhúsnæði þá má útbúa hana með:

kaupskra$ibud <- NA
kaupskra$ibud[grep("Fjolbyli|Serbyli", kaupskra$tegund)] <- "Íbúðarhúsnæði"
kaupskra$ibud[grep("Atvinnuhusnaedi|Annað|Bilskur/skur|Sumarhus", kaupskra$tegund)] <- "Ekki íbúðarhúsnæði"

Nú er orðin til ný breyta sem inniheldur hvort hús sé íbúðarhúsnæði. Breytan er sjálfkrafa orðabreyta fyrst við gáfum henni orðagildi.

str(kaupskra$ibud)
##  chr [1:169636] "Ekki íbúðarhúsnæði" "Ekki íbúðarhúsnæði" ...

Getum líka notað str_detect() skipunina úr stringr pakkanum til að búa til breytur. Þá er hægt t.d. að búa til nýja breytu Laugarvegur sem geymir TRUE ef eignin er á Laugarveginum. Nú er orðin til ný breyta sem inniheldur hvort hús sé íbúðarhúsnæði. Breytan er sjálfkrafa orðabreyta fyrst við gáfum henni orðagildi.

str(kaupskra$ibud)
##  chr [1:169636] "Ekki íbúðarhúsnæði" "Ekki íbúðarhúsnæði" ...

Getum líka notað str_detect() skipunina úr stringr pakkanum til að búa til breytur. Þá er hægt t.d. að búa til nýja breytu Laugarvegur sem geymir TRUE ef eignin er á Laugarveginum.

kaupskra$Laugarvegur<-str_detect(kaupskra$heimilisfang, "Laugarvegur")

Skoðum hvaða eignir eru á Laugarveginum

which(kaupskra$Laugarvegur==TRUE)
## [1]  75723  75724  75725  75726  75727  75728  75729  75730
## [9]  75731  75732  75733  75734  75735  75736  75737  75903
## [17] 75904  75905  75906  75907  75908  75909  75910  75911
kaupskra$Laugarvegur<-str_detect(kaupskra$heimilisfang, "Laugarvegur")

Skoðum hvaða eignir eru á Laugarveginum

which(kaupskra$Laugarvegur==TRUE)
## [1]  75723  75724  75725  75726  75727  75728  75729  75730
## [9]  75731  75732  75733  75734  75735  75736  75737  75903
## [17] 75904  75905  75906  75907  75908  75909  75910  75911

2.6.6. F: Breytt um heiti á breytum

2.6.6.1. rename()

Athugið

Inntak: nafn á gagnatöflu og nöfn á breytum

Úttak: gagnatafla

Pakki: dplyr


Hægt er, á auðveldan hátt, að endurskýra breytur í gagnatöflu með rename() aðferðinni. Viljum við t.d. breyta nafninu á breytunni is í uppahalds_is gerum við það með:

konnun<-rename(konnun,uppahalds_is=is)

Til að valda ekki ruglingi hér breytum við nafninu aftur í is með:

konnun<-rename(konnun,is=uppahalds_is)

2.6.7. G: Vörpunum beitt á talnabreytur

Að lokum viljum við oft búa til nýjar, afleiddar breytur út frá öðrum flokkabreytum. Þannig getum við t.d. búið til breytuna fermetraverð út frá kaupverði og einingarflatarmál eignar:

kaupskra$fermetraverd <- kaupskra$kaupverd*1000/kaupskra$einflm

Athugið að hér þarf að margfalda kaupverð með 1000, þar sem í kaupskra er kaupverd ekki gefið í milljónum.

Hér má einnig nota mutate() fallið sem er oft þægilegra.

kaupskra <- mutate(kaupskra, fermetraverd=kaupverd*1000/einflm)

2.7. Umröðun gagna

2.7.1. Umröðun gagna

Ef gagnatöflurnar sem verið er að vinna með innihalda margar breytur getur verið gott að geta valið þær breytur sem við ætlum að vinna með á auðveldan hátt. Við getum t.d. búið til nýja gagnatöflu sem inniheldur aðeins breyturnar keupverd og einflm (takið eftir að nýja gagnataflan er ekki geymd í nýjum hlut hér, ætlum við að nota hana þurfum við að búa til nýja töflu eins og hér að neðan).

select(kaupskra,einflm,kaupverd)
##     einflm  kaupverd
## 1   780.4   87000
## 2   400.0   36000
## 3   310.2   31000
## 4   310.2   31000
## 5   71.4    23500
## 6   325.0   33500
## 7   310.2   31000
## 8   310.2   31000
## 9   307.2   37000
....

Getum búið til nýtt gagnasett sem inniheldur einungis breyturnar kaupverd og einflm með:

::

kaupskra2 <-select(kaupskra, einflm, kaupverd)

Við getum einnig notað select() aðferðina til að búa til nýja gagnatöflu sem inniheldur alla dálka upphaflegu töflunnar að undanskildum nokkrum. Viljum við t.d. búa til nýja gagnatöflu sem inniheldur allar breytur upphaflegu töflunnar nema postnr og sveitarfelag gerum við það með:

kaupskra3<-select(kaupskra,-c(postnr,sveitarfelag))

2.7.1.1. group_by()

Athugið

Inntak: nafn á gagnatöflu og nafn á flokkabreytum

Helstu stillingar: .drop1


Group_by() skipunin leyfir okkur að skipta gagnasafninu upp eftir einni eða fleiri ákveðinni breytu. Síðan má reikna allskyns lýsistærðir fyrir hvern og einn hóp.

Skoðum með meðalferðtími fólks er í skóla eftir ferðamáta

hopar <- group_by(konnun, ferdamati_skoli)
summarise(hopar, mean(ferdatimi_skoli))
## ferdamati_skoli               mean(ferdatimi_skoli)
## Gangandi / skokkandi               7.588235
## Með einkabíl                     19.923077
## Með strætó                          33.733333
## Á annan hátt                     2.500000
## Á hjóli / rafhlaupahjóli      11.666667

Skoðum svo hver lengst ferðatími í skóla eftir bæði ferðamáta og uppáhaldsís.

hopar2 <- group_by(konnun, ferdamati_skoli, is)
summarise(hopar, max(ferdatimi_skoli))
## ferdamati_skoli         is             max(ferdamati_skoli)
## Gangandi / skokkandi         Jarðaberja      30
## Gangandi / skokkandi         Súkkulaði       25
## Gangandi / skokkandi         Vanilla            11
## Með einkabíl               Jarðaberja        45
## Með einkabíl               Súkkulaði         50
## Með einkabíl               Vanilla              60
## Með strætó                    Jarðaberja     70
## Með strætó                    Súkkulaði      45
## Með strætó                    Vanilla           75
## Á annan hátt               Jarðaberja     0

2.7.1.2. sort()

Athugið

Inntak: nafn á vigri

Úttak: vigur með röðuðum gildum

Helstu stillingar: decreasing


Oft getur verið þægilegt að raða mælingunum okkar eftir stærðarröð. Viljum við raða gildunum á einni breytu/vigri í stærðarröð gerum við það með sort() aðferðinni. Viljum við t.d. skoða mælingarnar á kaupverði í stærðarröð gerum við það með:

sort(kaupskra$kaupverd)
##   [1]    1    1    1    1    1   1    1    1    1    1
##   [11]   1    1    1    1    1   1    1    1    1    2
##   [21]   10   19   20   30   30  30   40   50   50   50
##   [31]   50   60   66   66  100  100  100  100  100  100
##   [41]  100  100  100  100  100  100  100  100  130  150
##   [51]  150  150  164  164  167  170  194  200  200  200
....

2.7.1.3. arrange()

Athugið

Inntak: nafn á gagnatöflu og nöfn á breytum

Úttak: gagnatafla

Pakki: dplyr


Í sumum tilfellum er einnig gott að geta raðað viðfangsefnum í gagnatöflu eftir ákveðinni röð. arrange() aðferðin gerir okkur það kleift á auðveldan hátt. Við mötum aðferðina með nafninu á gagnatöflunni og breytunum sem við viljum raða eftir. Viljum við t.d. raða viðfangsefnunum í kaupskra gagnasafninu eftir kaupverði gerum við það með:

arrange(kaupskra,kaupverd)
##     kaupverd   utgdag      postnr   sveitarfelag      byggar   tegund
## 1   1          2006-09-05 580      Fjallabyggð       1937     Atvinnuhusnaedi
## 2   1          2018-06-08  760      Fjallabyggð       1973     Atvinnuhusnaedi
## 3   1          2015-10-13  750      Fjallabyggð       NA       Serbyli
## 4   1          2006-09-05  580      Fjallabyggð       1947     Atvinnuhusnaedi
## 5   1          2015-10-13 750      Fjallabyggð       NA       Serbyli
## 6   1          2015-10-13  750      Fjallabyggð       NA       Serbyli
## 7   1          2015-10-13  750      Fjallabyggð       NA       Serbyli
## 8   1          2008-12-22  104      Reykjarvíkurborg  1967     Fjolbyli
## 9   1          2016-06-02  640      Norðurþing        1995     Fjolbyli
....

Viljum við hins vegar raða fyrst eftir dagsetning undirskriftar kaupsamnings og svo eftir kaupverði gerum við það með:

arrange(kaupskra,utgdag,kaupverd)
##     kaupverd   utgdag      postnr   sveitarfelag      byggar    tegund
## 1   14800      2006-01-20 810      Hveragerðisbær    1930      Serbyli
## 2   17411      2006-01-31  103      Reykjarvíkurborg  2007      Fjolbyli
## 3   396000     2006-02-02  700      Múlaþing          1977      Atvinnuhusnaedi
## 4   396000     2006-02-02  700      Múlaþing          1977      Atvinnuhusnaedi
## 5   396000     2006-02-02 700      Múlaþing          1977      Atvinnuhusnaedi
## 6   396000     2006-02-02  700      Múlaþing          1966      Atvinnuhusnaedi
## 7   396000     2006-02-02  700      Múlaþing          1966      Atvinnuhusnaedi
## 8   396000     2006-02-02  700      Múlaþing          1924      Atvinnuhusnaedi
## 9   4000       2006-02-11  425      Ísafjarðarbær     1958      Serbyli
....

2.7.1.4. pivot_longer()

Athugið

Inntak: gagnatafla og tveir eða fleiri vigrar

Úttak: gagnatafla

Pakki: tidyr


Skipunin pivot_longer() varpar gögnum úr víðu sniði í langt á handhægan hátt. Sem dæmi eru upplýsingarnar um púls núna geymdar í tveimur breytum, fyrriPuls og seinniPuls. Við gætum þess í stað haft eina breytu, pulsmaeling, sem geymir púlsmælinguna og aðra breytu, nr.maelingar sem tilgreinir hvort mælingin eigi við fyrri eða seinni púlsmælinguna. Þetta er framkvæmt með skipuninni:

pulslangt <- puls %>% pivot_longer(c(fyrriPuls,seinniPuls), names_to="nr.maelingar", values_to="pulsmaeling")

Fyrst tökum við fram hvaða gagnatöflu við erum að vinna með og pípum henni í skipunina, við tilgreinum svo fyrriPuls og seinniPuls sem breyturnar sem við viljum varpa á langt snið. Næst kemur hvað breytan sem greinir að hvort að mælingin er fyrr eða seinni púlsmæling á að heita. Við látum hana heita nr.maelingar. Þar næst kemur hvað breytan sem tilgreinir hver mældi púlsinn er heitir, við gefum henni nafnið pulsmaeling

Eftir skipunina lítur gagnataflan svona út:

head(pulslangt)
##    # A tibble: 6 × 5
##      id likamsraekt inngrip  nr.maelingar pulsmaeling
##   <int>       <dbl> <chr>    <chr>              <int>
## 1     1         2   hljop    fyrriPuls             80
## 2     1         2   hljop    seinniPuls           103
## 3     2         1   sat_kyrr fyrriPuls             90
## 4     2         1   sat_kyrr seinniPuls            91
## 5     3         3.5 sat_kyrr fyrriPuls             83
## 6     3         3.5 sat_kyrr seinniPuls            84

2.7.1.5. pivot_wider()

Athugið

Inntak: nafn á gagnatöflu og tveir vigrar

Úttak: gagnatafla

Pakki: tidyr


Skipunin pivot_wider() er andhverfa pivot_longer(), þ.e.a.s. hún varpar gögnum úr löngu sniði í vítt. Þannig vörpum við löngu pulslangt gögnunum sem við bjuggum til að ofan yfir í langt snið með skipuninni:

pulsvitt <- pulslangt %>% pivot_wider(names_from=nr.maelingar, values_from=pulsmaeling)

Hér þarf eingöngu að tilgreina breyturnar tvær sem á að skilja í sundur. R sér um rest, eins og sjá má:

head(pulsvitt)
## # A tibble: 6 × 5
##      id likamsraekt inngrip  fyrriPuls seinniPuls
##   <int>       <dbl> <chr>        <int>      <int>
## 1     1         2   hljop           80        103
## 2     2         1   sat_kyrr        90         91
## 3     3         3.5 sat_kyrr        83         84
## 4     4         0   hljop           80        103
## 5     5         2   sat_kyrr        43         52
## 6     6         1   hljop           76        105

2.7.1.6. merge()

Athugið

Inntak: tvær gagnatöflur

Úttak: ein sameinuð gagnatafla

Helstu stillingar: by, all.x, all.y


Að lokum er merge() einstaklega handhæg skipun til að sameina tvær gagnatöflur. Hugsum okkur sem svo að við hefðum bakgrunnsupplýsingar um nemendurna í einni gagnatöflu, en púlsmælingarnar í annarri gagnatöflu. Hver og ein skrá hefði svo að geyma lykil, t.d. gervinúmer fyrir hvern og einn nemanda sem gerir okkur kleift að para saman mælingarnar. Búum til að byrja með til tvær slíkar gagnatöflur til að geta sýnt hvernig þær væru sameinaðar ef svo væri raunin:

puls$id <- 1:(dim(puls)[1])  #lykill með gervinúmerum
bakgrunnur <- select(puls,id, namskeid, haed, thyngd, aldur,
kyn, reykir, drekkur, likamsraekt, likamsraektf )
pulsmaeling <- select(puls, id, kronukast, fyrriPuls, seinniPuls,
inngrip, dagsetning, ar)

Hér má sjá gagnatöflurnar tvær:

head(bakgrunnur)
##   id namskeid haed thyngd aldur kyn reykir drekkur likamsraekt
## 1  1  STAE209  161     60    23 kvk    nei     nei         3.5
## 2  2   LAN203  185    115    52  kk   <NA>      ja         0.0
## 3  3   LAN203  167     NA    22 kvk    nei      ja         2.0
## 4  4  STAE209  174     67    21 kvk    nei      ja         1.0
## 5  5  STAE209  163     57    20 kvk    nei      ja         5.0
## 6  6  STAE209  175     59    20 kvk    nei      ja         5.0
##   likamsraektf
## 1     Miðlungs
## 2        Lítil
## 3     Miðlungs
## 4        Lítil
## 5        Mikil
## 6        Mikil
head(pulsmaeling)
##   id   kronukast fyrriPuls seinniPuls  inngrip dagsetning   ar
## 1  1 landvaettir        83         84 sat_kyrr 2013-01-07 2013
## 2  2    thorskur        80        103    hljop 2013-01-07 2013
## 3  3 landvaettir        43         52 sat_kyrr 2013-01-07 2013
## 4  4    thorskur        76        105    hljop 2013-01-07 2013
## 5  5    thorskur        71         68 sat_kyrr 2013-01-07 2013
## 6  6 landvaettir        65         65 sat_kyrr 2013-01-07 2013

Þær eru sameinaðar með skipuninni merge():

puls <- merge(bakgrunnur, pulsmaeling)

sem er sama skrá og við byrjuðum með:

dim(puls)
## [1] 471  16
head(puls)
##   id namskeid haed thyngd aldur kyn reykir drekkur likamsraekt
## 1  1  STAE209  161     60    23 kvk    nei     nei         3.5
## 2  2   LAN203  185    115    52  kk   <NA>      ja         0.0
## 3  3   LAN203  167     NA    22 kvk    nei      ja         2.0
## 4  4  STAE209  174     67    21 kvk    nei      ja         1.0
## 5  5  STAE209  163     57    20 kvk    nei      ja         5.0
## 6  6  STAE209  175     59    20 kvk    nei      ja         5.0
##   likamsraektf   kronukast fyrriPuls seinniPuls  inngrip dagsetning   ar
## 1     Miðlungs landvaettir        83         84 sat_kyrr 2013-01-07 2013
## 2        Lítil    thorskur        80        103    hljop 2013-01-07 2013
## 3     Miðlungs landvaettir        43         52 sat_kyrr 2013-01-07 2013
## 4        Lítil    thorskur        76        105    hljop 2013-01-07 2013
## 5        Mikil    thorskur        71         68 sat_kyrr 2013-01-07 2013
## 6        Mikil landvaettir        65         65 sat_kyrr 2013-01-07 2013

Sjálfgefið er að sameina gagnatöflurnar tvær á öllum þeim breytum sem bera sama heiti í töflunum tveimur. Í þessu tilviki er bara ein breyta sem ber sama heitið, það er breytan id og því er eingöngu sameinað eftir henni. Ef að fleiri breytur hafa sama heiti, en við viljum þó ekki sameina eftir þeim, þá tilgreinum við það með stillingunni by.

Sömuleiðis er sjálfgefið að sameina eingöngu þær mælingar sem svara til lykils sem er að finna í báðum töflunum. Þ.e.a.s. ef að tiltekið id í dæminu hér að ofan væri eingöngu að finna í gagnatöflunni bakgrunnur en ekki í gagnatöflunni pulsmaeling þá væri henni sleppt. Við getum sagt R að sleppa engri mælingu í fyrri gagnatöflunni (og fylla þá upp í breyturnar úr seinni töflunni með NA með stillingunni all.x=TRUE). Á sama hátt getum við bætt við all.y=TRUE ef við viljum að það sama gildi fyrir seinni gagnatöfluna.

2.8. Fleiri skipanir fyrir kóðun breyta\(^\ast\)

2.8.1. Fleiri skipanir fyrir kóðun breyta\(^\ast\)

Fjórar skipanir sem koma oft að góðum notum við kóðun breyta eru paste(), sprintf(), separate() og substr().

2.8.1.1. paste()

Athugið

Inntak: tveir vigrar, eða vigur og gildi

Úttak: vigur með gildunum sameinuðum

Helstu stillingar: sep


Skipunin paste() býr til einn vigur með því að skella saman gildunum í tveimur vigrum. Stillingin sep tilgreinir hvaða tákna skal notað til að sameina vigrana. Þannig getum við búið til nýja breytur sem tilgreinir í hvaða sveitarfélag og hvaða póstnúmer ein er í.

kaupskra$sveitarf_post <- paste(kaupskra$sveitarfelag, kaupskra$postnr)
str(kaupskra$sveitarf_post)
##  chr [1:169636] "Kópavogsbær 200" "Hafnarfjarðarkaupstaður 220"
##  "Reykjavíkurborg 104" ...

2.8.1.2. sprintf()

Athugið

Inntak: strengur (eða strengjavigur) með skiptitákni, annað inntak

Úttak: vigur með nýjum streng byggðum á inntaki


Skipunin sprintf() býr til einn vigur með því að taka streng með sérstökum skiptitáknum og skipta þeim út fyrir gildin úr öðru inntaki fallsins. Vilji maður t.d. búa til streng sem gefur manni dagsetningu þá er það hægt með:

sprintf('Dagurinn í dag er %s', Sys.Date())
## [1] "Dagurinn í dag er 2024-16-05"

þar sem \(\%\)s er skiptitáknið.

2.8.1.3. separate()

Athugið

Inntak: einn vigur og tákn sem á skipta gildunum upp eftir

Úttak: tveir eða fleiri vigrara

Pakki: tidyr


Skipunin separate() er andhverfa skipunarinnar paste(), þ.e.a.s. hún slítur í sundur breytur eftir einhverju tákni og býr til tvær eða fleiri nýjar. Þannig getum við skipt dagsetningunni upp í þrjár breytur: dag, mánuð og ár með skipuninni:

kaupskra_nytt <- separate(kaupskra, utgdag, into=c('ar','manudur','dagur'), sep='-')

Hér má sjá nýju gagnatöfluna, með þremur nýjum breytum:

head(kaupskra_nytt)
##     kaupverd  ar    manudur   dagur    postnr   sveitarfelag
## 1   87000     2012  07        30        200      Kópavogsbær
## 2   36000     2011  02        28       220      Hafnarfjarðarkaupstaður
## 3   31000     2012  04        16       104      Reykjarvíkurborg
## 4   31000     2012  04        16       104      Reykjarvíkurborg
## 5   23500     2018  02        20        104      Reykjarvíkurborg
## 6   33500     2013  10        25       104      Reykjarvíkurborg
...

2.8.1.4. substr()

Athugið

Inntak: orðabreyta og vísar bókstafa sem skulu valdir

Úttak: sá hluti úr orðabreytunni sem svarar til þeirra vísa


Skipunin substr() velur ákveðna bókstafi úr orðabreytu, til dæmis þriðja til sjöunda bókstafinn, eða álíka. Ef við viljum sem dæmi bara fá fyrstu þrjá stafina í nöfnunum á námskeiðunum, þá gerum við það með:

substr(kaupskra$tegund, 1,3)
##   [1] "Atv" "Atv" "Atv" "Atv" "Atv" "Atv" "Atv" "Atv" "Atv" "Fjo"
##   [11] "Atv" "Atv" "Fjo" "Fjo" "Fjo" "Fjo" "Atv" "Atv" "Fjo" "Fjo"
##   [21] "Fjo" "Fjo" "Atv" "Fjo" "Fjo" "Atv" "Atv" "Atv" "Atv" "Atv"
....

2.9. Fleiri skipanir fyrir sameiningu gagna\(^\ast\)

2.9.1. Fleiri skipanir fyrir sameiningu gagna\(^\ast\)

2.9.1.1. cbind()

Athugið

Inntak: vigrar, gagnatöflur eða fylki

Úttak: gagnatöflur eða fylki


2.9.1.2. rbind()

Athugið

Inntak: vigrar, gagnatöflur eða fylki

Úttak: gagnatöflur eða fylki


Það er einnig einfalt að sameina vigra, fylki eða gagnatöflur. Til þess notum við skipanirnar rbind() og cbind(). Skipunin rbind() bætir við línu á meðan skipunin cbind() bætir við dálki.

rbind(1:4, 5:8)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
cbind(1:4, 5:8)
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
## [3,]    3    7
## [4,]    4    8

2.10. Leiksvæði fyrir R kóða

Hér fyrir neðan er hægt að skrifa R kóða og keyra hann. Notið þetta svæði til að prófa ykkur áfram með skipanir kaflans. Athugið að við höfum þegar sett inn skipun til að lesa inn puls gögnin sem eru notuð gegnum alla bókina.

# Gogn sott og sett i breytuna puls. puls <- read.table ("https://raw.githubusercontent.com/edbook/haskoli-islands/main/pulsAll.csv", header=TRUE, sep=";") # Setjid ykkar eigin koda her fyrir nedan: # Sem daemi, skipunin head(puls) skilar fyrstu nokkrar radirnar i gognunum # asamt dalkarheitum. head(puls)