Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

reshape2

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

alt text

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 reshape2 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

melt()

Transformeeri lai andmestik pikaks.

alt text

library(reshape2)

# Näide 1
melt(andmed, id.vars=c("nimi", "sugu"))
##     nimi sugu variable value
## 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
melt(andmed, id.vars=1:2)
##     nimi sugu variable value
## 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
melt(andmed, measure.vars=c("vanus", "pikkus", "kaal"))
##     nimi sugu variable value
## 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
melt(andmed, measure.vars=3:5)
##     nimi sugu variable value
## 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 5
melt(andmed, measure.vars=2:5)
## Warning: attributes are not identical across measure variables; they will
## be dropped
##      nimi variable value
## 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

dcast()

Transformeeri pikk andmestik laiaks.

alt text

# pikas formaadis andmed
andmed.m = melt(andmed, id.vars=c("nimi", "sugu"))
andmed.m
##     nimi sugu variable value
## 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
dcast(andmed.m, nimi + sugu ~ variable, value.var = "value")
##     nimi sugu vanus pikkus kaal
## 1   Kati    N    30    150   50
## 2   Mati    M    20    180   80
## 3 Toomas    M    60    200  100

Abiks võib olla järgmine värviline illustratsioon.

alt text