Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

tidyr

tidyr

tidyr on Hadley Wickhami kirjutatud R-i pakett, mis aitab laias formaadis andmetabelit transformeerida pikas formaadis andmestikuks ja vastupidi.

Laias formaadis andmestik - üks rida vastab ühele objektile. Selles reas on kirjas kõik, mis antud objekti kohta üldse mõõdetud on.

Pikas formaadis andmestik - ühe objekti andmed võivad esineda mitmel real. Iga rida kirjeldab ühe objekti ühte tunnust. Loomulikult võib laia ja pika formaadi vahel olla palju vahepealseid variante – näiteks ka ülaltoodud pikka formaati saab veel pikemaks venitada (kuidas?).

Paljud paketid tahavad sisendiks pikas formaadis andmeid (nt ggplot2 pakett või funktsioonid lm(), glm()). Inimestel on aga mugavam vaadelda ja sisestada andmeid laias formaadis. Loe artiklist Tidy Data, milline on Hadley Wickham’i arvates hea andmete esitusviis.

Järgnevalt on toodud minimalistlikud näited, mis iseloomustavad paketi tidyr funktsionaalsust.

andmed = data.frame(nimi= c("Mati", "Toomas", "Kati"),
                    sugu = c("M", "M", "N"),
                    vanus = c(20, 60, 30),
                    pikkus = c(180, 200, 150),
                    kaal = c(80, 100, 50))
andmed
##     nimi sugu vanus pikkus kaal
## 1   Mati    M    20    180   80
## 2 Toomas    M    60    200  100
## 3   Kati    N    30    150   50

gather()

Transformeeri lai andmestik pikaks.

library(tidyr)

# Näide 1
gather(andmed, key=tunnus, value=vaartus, vanus, pikkus, kaal)
##     nimi sugu tunnus vaartus
## 1   Mati    M  vanus      20
## 2 Toomas    M  vanus      60
## 3   Kati    N  vanus      30
## 4   Mati    M pikkus     180
## 5 Toomas    M pikkus     200
## 6   Kati    N pikkus     150
## 7   Mati    M   kaal      80
## 8 Toomas    M   kaal     100
## 9   Kati    N   kaal      50
# Näide 2
gather(andmed, key=tunnus, value=vaartus, vanus:kaal)
##     nimi sugu tunnus vaartus
## 1   Mati    M  vanus      20
## 2 Toomas    M  vanus      60
## 3   Kati    N  vanus      30
## 4   Mati    M pikkus     180
## 5 Toomas    M pikkus     200
## 6   Kati    N pikkus     150
## 7   Mati    M   kaal      80
## 8 Toomas    M   kaal     100
## 9   Kati    N   kaal      50
# Näide 3
gather(andmed, key=tunnus, value=vaartus, -nimi, -sugu)
##     nimi sugu tunnus vaartus
## 1   Mati    M  vanus      20
## 2 Toomas    M  vanus      60
## 3   Kati    N  vanus      30
## 4   Mati    M pikkus     180
## 5 Toomas    M pikkus     200
## 6   Kati    N pikkus     150
## 7   Mati    M   kaal      80
## 8 Toomas    M   kaal     100
## 9   Kati    N   kaal      50
# Näide 4
gather(andmed, key=tunnus, value=vaartus, -nimi)
## Warning: attributes are not identical across measure variables; they will
## be dropped
##      nimi tunnus vaartus
## 1    Mati   sugu       M
## 2  Toomas   sugu       M
## 3    Kati   sugu       N
## 4    Mati  vanus      20
## 5  Toomas  vanus      60
## 6    Kati  vanus      30
## 7    Mati pikkus     180
## 8  Toomas pikkus     200
## 9    Kati pikkus     150
## 10   Mati   kaal      80
## 11 Toomas   kaal     100
## 12   Kati   kaal      50
# Näide 5
gather_(andmed, key_col="tunnus", value_col="vaartus", 
        gather_cols = c("sugu","vanus","pikkus","kaal"))
## Warning: attributes are not identical across measure variables; they will
## be dropped
##      nimi tunnus vaartus
## 1    Mati   sugu       M
## 2  Toomas   sugu       M
## 3    Kati   sugu       N
## 4    Mati  vanus      20
## 5  Toomas  vanus      60
## 6    Kati  vanus      30
## 7    Mati pikkus     180
## 8  Toomas pikkus     200
## 9    Kati pikkus     150
## 10   Mati   kaal      80
## 11 Toomas   kaal     100
## 12   Kati   kaal      50

spread()

Transformeeri pikk andmestik laiaks.

# pikas formaadis andmed
andmed.pikk = gather(andmed, key=tunnus, value=vaartus, -nimi, -sugu)
andmed.pikk
##     nimi sugu tunnus vaartus
## 1   Mati    M  vanus      20
## 2 Toomas    M  vanus      60
## 3   Kati    N  vanus      30
## 4   Mati    M pikkus     180
## 5 Toomas    M pikkus     200
## 6   Kati    N pikkus     150
## 7   Mati    M   kaal      80
## 8 Toomas    M   kaal     100
## 9   Kati    N   kaal      50
# Näide 1
spread(andmed.pikk, key=tunnus, value=vaartus)
##     nimi sugu kaal pikkus vanus
## 1   Kati    N   50    150    30
## 2   Mati    M   80    180    20
## 3 Toomas    M  100    200    60
# Näide 2
spread_(andmed.pikk, key_col="tunnus", value_col="vaartus")
##     nimi sugu kaal pikkus vanus
## 1   Kati    N   50    150    30
## 2   Mati    M   80    180    20
## 3 Toomas    M  100    200    60