Endurkóðun í R

Við hjá Tölfræðiráðgjöf HVS erum stundum að fá spurningar um hvernig sé best að endurkóða (e. recode) breytur í gagnasettum í tölfræðiforritinu R. Í upphafi rannsóknar þarf oft að “taka til” í nýjum gagnasettum og aðlaga gögnin eftir þeirri aðferðarfræði sem verið er að fara að nota og þá þarf oft að endurkóða gögnin. Til dæmis þarf stundum að flokka talnabreytur eins og aldur, BMI, kólesteról magn eða aðrar talnabreytur eftir ákveðnum flokkum og þá er hentugt að kunna að endurkóða breyturnar.

Í R eru til ótal aðferðir til að gera þetta en í grunninn er verið að búa til nýja breytu (nýjan dálk) með nýjum flokkum (t.d. aldursflokkar: 1: <18 ára, 2: 19-25, 3: 26-40, 4: >41) útfrá t.d. talnabreytu.

Hér á eftir verða taldar upp þrjár aðferðir sem hægt er að nota í R en einnig má finna leiðbeiningar á kennslubanki.hi.is, Cookbook for R, Quick-R og fleiri stöðum.

Fyrir SPSS má finna leiðbeiningar t.d. á Lærd Statistics og Ken State University síðunni.

Byrjum á að skoða “cars” gagnasettið:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10

Hér má sjá að gagnaettið inniheldur aðeins tvær breytur (speed og distance). Við getum prófað að endurkóða “speed” í nýja breytu (speed_fl) og flokkað hraðann sem “low”, “medium” eða “high”.

Hér er grunn aðferð sem má nota en hér sést vel hvað er verið að gera.

Aðferð 1

Köllum nýju breytuna “speed_fl”

cars$speed_fl <- 0
cars$speed_fl[cars$speed <= 12  ] <- "low"
cars$speed_fl[cars$speed > 12 & cars$speed < 19] <- "medium"  # Merkjum hraða yfir 12 og 
                                                              # undir 19 sem medium    
cars$speed_fl[cars$speed >= 19  ] <- "high"   

Þá getum við séð að búið er að bæta við flokkabreytu að nafni “speed_fl” með flokkana “low”, “medium” og “high”.

str(cars)
## 'data.frame':    50 obs. of  3 variables:
##  $ speed   : num  4 4 7 7 8 9 10 10 10 11 ...
##  $ dist    : num  2 10 4 22 16 10 18 26 34 17 ...
##  $ speed_fl: chr  "low" "low" "low" "low" ...
table(cars$speed_fl)
## 
##   high    low medium 
##     15     15     20

Aðferð 2

Einnig er cut() mjög gagnleg skipun til að gera það sama og að ofan.
Við skulum prófa að búa til enn aðra breytu fyrir hraðann, “speed_fl2” og flokka hraðann í “low”, “medium” og “high” með þeirri skipun.

Við skulum hafa inni -Inf/Inf þó að hraðinn sé ekki í mínus (-) en þetta er oft gagnlegt að nota með önnur gagnasett.

cars$speed_fl2 <- cut(cars$speed,
                breaks=c(-Inf, 12, 18, Inf),          # Hérna flokkast 12 í low og 18 í medium*
                labels=c("low","medium","high"))

Þetta er ef til vill einfaldari leið til að flokka breytur í nokkra nýja flokka, en þessi skipun tekur oft ekki eins margar línur fyrir kóða eins og aðferð 1.

*Til að ákvarða hvort að gildi sem lenda nákvæmlega á mörkunum falli í efri eða neðri flokknum má stilla skipunina með “right” Það er sjálfgefin stilling að gildið lendi í neðri flokknum.
Teiknum upp graf

Til gamans er hægt að teikna upp graf með fjölda bíla eftir nýjum flokkum með hjálp ggplot.

Byrjum á að endurraða flokkunum í stræðarröð og teiknum svo upp grafið.

library(ggplot2)
cars$speed_fl <- ordered(cars$speed_fl,              # Endurröðum flokkunum svo 
                levels = c("low", "medium", "high")) # það komi í stærðarröð



ggplot(cars, aes(speed_fl))+
    geom_bar(fill="firebrick") +                 # Setjum skemmtilegan lit
    xlab("Hraði") +                              # Bætum við heiti ásanna
    ylab("Fjöldi") +
    labs(title = "Fjöldi bíla eftir hraða") +    # Titill
    theme_bw()                                   # Tökum gráan lit úr bakgrunni

plot of chunk unnamed-chunk-5


Aðferð 3

Að lokum vil ég nefna gagnlega aðferð ef við viljum endurkóða breytu í tvo flokka. En það er skipunin ifelse().

Prófum að nota þessa skipun á “dist” breytu gagnasettsins og skiptum fjarlægðinni eftir miðgildi hennar (36). Þá er þetta skrifað þannig:

cars$dist_fl <- ifelse(cars$dist > 36, c("lengra"), c("styttra")) 

Skipunin segir, ef fjarlægðin er meiri en 36 (miðgildi í þessu tilfelli), þá færðu flokkinn “lengra”, annars færðu flokkinn “styttra”.


Endurkóðað gagnasett

Og þá getum við skoðað gagnasettið og séð að þetta passar allt við það sem við höfum verið að endurkóða.

cars
##    speed dist speed_fl speed_fl2 dist_fl
## 1      4    2      low       low styttra
## 2      4   10      low       low styttra
## 3      7    4      low       low styttra
## 4      7   22      low       low styttra
## 5      8   16      low       low styttra
## 6      9   10      low       low styttra
## 7     10   18      low       low styttra
## 8     10   26      low       low styttra
## 9     10   34      low       low styttra
## 10    11   17      low       low styttra
## 11    11   28      low       low styttra
## 12    12   14      low       low styttra
## 13    12   20      low       low styttra
## 14    12   24      low       low styttra
## 15    12   28      low       low styttra
## 16    13   26   medium    medium styttra
## 17    13   34   medium    medium styttra
## 18    13   34   medium    medium styttra
## 19    13   46   medium    medium  lengra
## 20    14   26   medium    medium styttra
## 21    14   36   medium    medium styttra
## 22    14   60   medium    medium  lengra
## 23    14   80   medium    medium  lengra
## 24    15   20   medium    medium styttra
## 25    15   26   medium    medium styttra
## 26    15   54   medium    medium  lengra
## 27    16   32   medium    medium styttra
## 28    16   40   medium    medium  lengra
## 29    17   32   medium    medium styttra
## 30    17   40   medium    medium  lengra
## 31    17   50   medium    medium  lengra
## 32    18   42   medium    medium  lengra
## 33    18   56   medium    medium  lengra
## 34    18   76   medium    medium  lengra
## 35    18   84   medium    medium  lengra
## 36    19   36     high      high styttra
## 37    19   46     high      high  lengra
## 38    19   68     high      high  lengra
## 39    20   32     high      high styttra
## 40    20   48     high      high  lengra
## 41    20   52     high      high  lengra
## 42    20   56     high      high  lengra
## 43    20   64     high      high  lengra
## 44    22   66     high      high  lengra
## 45    23   54     high      high  lengra
## 46    24   70     high      high  lengra
## 47    24   92     high      high  lengra
## 48    24   93     high      high  lengra
## 49    24  120     high      high  lengra
## 50    25   85     high      high  lengra

Stutt samantekt

Þessar þrjár aðferðir eru bara örlítill hluti af mögulegum aðferðum sem notaðar eru til endurkóða breytur. Þegar maður er að hreinsa til gögnin sín þá þarf oft að aðlaga hverja skipun eftir sínum gögnum. Í upphafi getur þetta virst flókið en þetta er fljótt að koma og maður lærir að lesa úr hverri skipun fyrir sig.
Ef maður er í vandræðum þá er alltaf hægt að gera t.d. ?cut() í skipanagluggann til að fá hjálparglugga upp með leiðbeiningum hvernig skipunin er notuð.

Athugasemdir