Het cursuspakket

Tijdens onderstaande uitleg wordt gebruikt gemaakt van een aantal databestanden. Download nu het cursuspakket en plaats de data bestanden in de working directory.

Import en data cleanup script:

## data importeren ##
mydata <- read.csv("medicijn_schoon.csv", header=TRUE)

## Supersnelle Cleanup ##
# Order Cholesterol
levels = levels(mydata$chol)
een <- levels[1]; twee <- levels[2]
mydata$chol = ordered(mydata$chol, levels = c(twee, een))

# Order bloeddruk
levels = levels(mydata$bp)
een <- levels[1]; twee <- levels[2]; drie <- levels(mydata$bp)[3]
mydata$bp = ordered(mydata$bp, levels = c(twee, drie, een))

Variabelen

Toevoegen en verwijderen

Gebruik de assign operators ( = & <- ) om een nieuwe variabele te maken. De nieuwe variabele kun je direct aan het bestaande data.frame toevoegen. Er zijn verschillende manieren om dit uit te voeren:

# Maak een data.frame
data = data.frame(c(3, 1, 4), c("aa", "bb", "cc"), c(TRUE, FALSE, TRUE))

# variabelen toevoegen
data$variabele      <- c("laag", "midden", "hoog")
data["variabele"]   <- c("1", "2", "3")
data$variabele      <- NA

# variabelen verwijderen
data$variabele      <- NULL
data["variabele"]   <- NULL
data[4]             <- NULL

Recoderen

Variabelen recoderen is het veranderen van de class van een bestaande variabele. Het komt regelmatig voor dat een variabele veranderd moet worden van numeriek (bv. leeftijd of CRP) naar een categorie (bv. risicoprofiel: laag, midden, hoog). Dit kan op verschillende manieren:

Van continue naar categoriaal

## Voorbeeld 1:  variabele leeftijd recoderen in een nieuwe CATEGORIALE variabele
head(mydata$age)
## [1] 23 47 47 28 49 41
# Maak nieuwe variabele $agecat
newdata <- mydata
newdata$agecat[mydata$age > 60] <- "oud"
newdata$agecat[mydata$age > 45 & mydata$age <= 60] <- "volwassen"
newdata$agecat[mydata$age <= 45] <- "jong"

# Controleer nieuwe variabele
head(newdata$agecat)
## [1] "jong"      "volwassen" "volwassen" "jong"      "volwassen" "jong"
## Voorbeeld 2: recoderen met de functie cut()
newdata$risico <- cut(mydata$age,
                    breaks=c(-Inf, 45, 60, Inf),
                    labels=c("jong","volwassen","oud"))

# Controleer nieuwe variabele
head(newdata$risico)
## [1] jong      volwassen volwassen jong      volwassen jong     
## Levels: jong volwassen oud
# Het voordeel van cut() is dat de nieuwe variabele als factor wordt geclassifiseerd met de labels als corresponderende levels.

Van categoriaal naar continue

Uiteraard is het ook mogelijk om de class te veranderen naar continue. Gebruik hiervoor as.numeric(). Voor meer informatie zie de syntax.

Computeren

Daarnaast is het mogelijk om te ‘rekenen’ met variabelen om zo nieuwe variabelen te maken:

# Maak een data.frame
lengte <- c(1.64, 1.88, 1.63)
gewicht <- c(65, 90, 74)
mijn.dataframe = data.frame(lengte, gewicht)
mijn.dataframe
##   lengte gewicht
## 1   1.64      65
## 2   1.88      90
## 3   1.63      74
# Maak een nieuwe variabele BMI op basis van het
mijn.dataframe$bmi <- mijn.dataframe$gewicht / mijn.dataframe$lengte^2
mijn.dataframe
##   lengte gewicht      bmi
## 1   1.64      65 24.16716
## 2   1.88      90 25.46401
## 3   1.63      74 27.85201
# maak een nieuwe AFGERONDE variabele BMI met de functie round()
mijn.dataframe$bmi <- round(mijn.dataframe$gewicht / mijn.dataframe$lengte^2, digits=2)
mijn.dataframe
##   lengte gewicht   bmi
## 1   1.64      65 24.17
## 2   1.88      90 25.46
## 3   1.63      74 27.85

Rekenen met datum en tijd

Het is mogelijk om berekeningen uit te voeren met dates in R. Zo kun je bijvoorbeeld de leeftijd uit de geboortedatum en opnamedatum berekenen. Ook is het mogelijk om berekeningen toe te passen zoals # mean(), range(), sd(), etc.

# VOORBEELD berekenen leeftijd uit geboortedatum en opnamedatum
geboortedatum = as.Date("1977-7-13")
opnamedatum = as.Date("2003-10-24")

# Bereken verschil
opnamedatum - geboortedatum 
## Time difference of 9599 days
# Bereken leeftijd
leeftijd = as.numeric(opnamedatum - geboortedatum)/365.25
leeftijd
## [1] 26.28063
# Rond de leeftijd af
round(leeftijd, digits=1)
## [1] 26.3

Dummie variabelen

Dummie variabelen zijn vaak nodig om te maken om statistische analyses te doen zoals bijvoorbeeld voor ANOVA.

Dummies

In onderstaand voorbeeld wordt van de categoriale variabele $drug (5 levels) een set nieuwe 5-tal dichotome variabelen gemaakt. In onderstaand voorbeeld wordt gebruik gemaakt van de function dcast() uit de package ‘reshape2’. Deze functie doet vrijwel hetzelfde als cast() maar maakt van de output automatisch een data.frame wat meestal wenselijk is.

# laad library reshape2
# gebruik functie dcast()
library(reshape2)

# Voorbeeld oude database 
head(mydata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# Transformeer variabele drug van LANG naar BREED
BREED <- dcast(mydata, age + sex + bp + chol + na + k ~ drug)

# voorbeeld nieuwe data
head(BREED)
##   age   sex      bp chol   na    k drugsA drugsB drugsC drugsX drugsY
## 1  15   man    laag hoog 0.70 0.04   <NA>   <NA>   <NA>   <NA> drugsY
## 2  15 vrouw    laag hoog 0.06 0.03   <NA>   <NA>   <NA>   <NA> drugsY
## 3  15 vrouw    hoog laag 0.06 0.01   <NA>   <NA>   <NA> drugsX   <NA>
## 4  16 vrouw    laag hoog 0.56 0.03   <NA>   <NA>   <NA>   <NA> drugsY
## 5  16 vrouw normaal laag 0.74 0.06   <NA>   <NA> drugsC   <NA>   <NA>
## 6  17 vrouw    hoog hoog 0.72 0.01   <NA>   <NA>   <NA> drugsX   <NA>
## Recodeer de variabelen naar TRUE/FALSE
# Recodeer de variabele "drug~" naar LOGICAL
BREED$drugsA[BREED$drugsA == "drugsA"] <- as.logical(1)
BREED$drugsB[BREED$drugsB == "drugsB"] <- as.logical(1)
BREED$drugsC[BREED$drugsC == "drugsC"] <- as.logical(1)
BREED$drugsX[BREED$drugsX == "drugsX"] <- as.logical(1)
BREED$drugsY[BREED$drugsY == "drugsY"] <- as.logical(1)

# Recodeer de variabele "NA" naar LOGICAL
BREED$drugsA[is.na(BREED$drugsA)] <- as.logical(0)
BREED$drugsB[is.na(BREED$drugsB)] <- as.logical(0)
BREED$drugsC[is.na(BREED$drugsC)] <- as.logical(0)
BREED$drugsX[is.na(BREED$drugsX)] <- as.logical(0)
BREED$drugsY[is.na(BREED$drugsY)] <- as.logical(0)

# controleer data.frame
head(BREED)
##   age   sex      bp chol   na    k drugsA drugsB drugsC drugsX drugsY
## 1  15   man    laag hoog 0.70 0.04  FALSE  FALSE  FALSE  FALSE   TRUE
## 2  15 vrouw    laag hoog 0.06 0.03  FALSE  FALSE  FALSE  FALSE   TRUE
## 3  15 vrouw    hoog laag 0.06 0.01  FALSE  FALSE  FALSE   TRUE  FALSE
## 4  16 vrouw    laag hoog 0.56 0.03  FALSE  FALSE  FALSE  FALSE   TRUE
## 5  16 vrouw normaal laag 0.74 0.06  FALSE  FALSE   TRUE  FALSE  FALSE
## 6  17 vrouw    hoog hoog 0.72 0.01  FALSE  FALSE  FALSE   TRUE  FALSE

Voor meer informatie over dummie variabelen in het kader van regressie analyse bekijk deze Youtube tutorial: MIKE


Data.frame

Sorteren

Als je een database wil sorteren kan dat met de functie: order(). Deze functie rangschikt de hele data.frame per gekozen variabele(n). Indien er ook NA’s in deze rij voorkomen kan je met het argument na.last= aangeven waar die komen te staan: bovenaan, onderaan, of verwijderd. Tevens kun je oplopend en aflopend sorteren met gebruik van de ‘-’ operator.

## Voorbeelden van sorteren
# sorteer mydata per leeftijd (standaard aflopend)
mydata <- mydata[order(mydata$age), ]
head(mydata)

# Sorteer per leeftijd, verwijder alle rijen met NA
mydata <- mydata[order(mydata$age, na.last=NA) , ]
head(mydata)

# Sorteer per geslacht, rijen met NA's onderaan
mydata <- mydata[order(mydata$sex, na.last=TRUE) , ]

# Sorteer per leeftijd, rijen met NA's bovenaan
mydata <- mydata[order(mydata$age, na.last=FALSE) , ]

# Sorteer per leeftijd (aflopend) en geslacht (oplopend), NA's verwijderen
mydata <- mydata[order(mydata$age, -mydata$sex, na.last=NA) , ]
head(mydata)

Let op: order() verandert inhoudelijks niks aan het data.frame. Het zet de rijen alleen in een andere volgorde.

Data Subset

R heeft uitgebreide index mogelijkheden voor het selecteren van variabelen uit een object (bv. data.frame). Deze indexering kan worden gebruikt om een selectie te maken van een groot bestand en daar variabelen (kolommen) en rijen (patiënten) uit te selecteren.

Variabelen

## SELECTEREN van variabelen
# print de eerste 6 rijen
head(mydata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# Maak een nieuwe data.frame, selecteer kolommen "1, 4 t/m 6"
newdata <- mydata[c(1,4:6)]
head(newdata)
##   age   sex      bp chol
## 1  23   man    laag laag
## 2  47 vrouw normaal laag
## 3  47 vrouw normaal laag
## 4  28   man    hoog laag
## 5  49   man    hoog laag
## 6  41 vrouw normaal laag
# selecteer variaben met de name index
myvars <- c("na", "k", "drug")
newdata <- mydata[c(myvars)]
head(newdata)
##     na    k   drug
## 1 0.79 0.03 drugsY
## 2 0.74 0.06 drugsC
## 3 0.70 0.07 drugsC
## 4 0.56 0.07 drugsX
## 5 0.79 0.05 drugsY
## 6 0.77 0.07 drugsC
## EXCLUDEREN
# controleer de eerste 6 rijen
head(mydata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# Maak een nieuwe data.frame, excludeer kolommen "1, 4,5,6""
newdata <- mydata[-c(1,4:6)]
head(newdata)
##     na    k   drug
## 1 0.79 0.03 drugsY
## 2 0.74 0.06 drugsC
## 3 0.70 0.07 drugsC
## 4 0.56 0.07 drugsX
## 5 0.79 0.05 drugsY
## 6 0.77 0.07 drugsC

Observaties

Het is ook mogelijk om bepaalde observaties (rijen) uit een dataframe te selecteren. Gebruik hiervoor de which() en subset() functie.

# Selecteer de observaties (rij) 8 tot en met 12
newdata <- mydata[8:12, ]     # Vergeet de , niet!
newdata
##    age   na    k   sex      bp chol   drug
## 8   47 0.90 0.08   man normaal laag drugsC
## 9   43 0.63 0.04 vrouw normaal laag drugsY
## 10 174 0.79 0.04   man normaal laag drugsY
## 11  50 0.08 0.07   man    hoog laag drugsX
## 12  43 0.66 0.05 vrouw    laag laag drugsA

Voorbeeld met which():

# Selecteer de variabelen waarbij het geslach vrouwelijk is en de leeftijd > 65 jaar.
newdata <- mydata[ which(mydata$sex=="vrouw" & mydata$age > 65), ]
head(newdata)
##    age   na    k   sex      bp chol   drug
## 23  74 0.72 0.07 vrouw    laag laag drugsB
## 37  67 0.85 0.08 vrouw    hoog hoog drugsX
## 44  67 0.82 0.04 vrouw normaal hoog drugsY
## 52  70 0.66 0.05 vrouw    laag laag drugsB
## 85  72 0.07 0.07 vrouw    laag hoog drugsB
## 93  67 0.72 0.08 vrouw    hoog hoog drugsX
# Gebruik de attach() en detach() functie om minder te hoeven typen
attach(mydata)
newdata <- mydata[ which(sex=='vrouw' & age > 65), ]
detach(mydata)

Voorbeeld met subset():

# Selecteer de MANNELIJKE patiënten van 20 jaar en ouder
newdata <- subset(mydata, age >= 20 & sex == "man")
head(newdata)
##    age   na    k sex      bp chol   drug
## 1   23 0.79 0.03 man    laag laag drugsY
## 4   28 0.56 0.07 man    hoog laag drugsX
## 5   49 0.79 0.05 man    hoog laag drugsY
## 8   47 0.90 0.08 man normaal laag drugsC
## 10 174 0.79 0.04 man normaal laag drugsY
## 11  50 0.08 0.07 man    hoog laag drugsX
# Selecteer MANNELIJKE patiënten OF pati?nten > 40 jaar
newdata <- subset(mydata, sex == "man" | age >= 40 )
head(newdata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# Selecteer alle mannelijke patiënten met een NORMAAL of HOGE bloeddruk
# Maak een nieuwe data.frame met alleen de variabelen: leeftijd, geslacht en bloeddruk
newdata <- subset(mydata, sex== "man" & bp > 1, select=c("age","sex","bp"))
head(newdata)
## [1] age sex bp 
## <0 rows> (or 0-length row.names)

Herstructureren

Het herstructureren van een data.frame is een stap die voor en tijdens de statistische analyse herhaaldelijk aan bod komt. Vaak is het nodig om eerst een herstructurering uit te voeren alvorens de statistische analyse toe te passen. Er komen een aantal stappen aan bod:

- Transposeren Het dataframe een kwartslag draaien
- Transformeren Hergroeperen van het dataframe
- Aggregeren Een samenvattingstabel maken
- Samenvoegen Meerdere dataframes aan elkaar binden

Transposeren

Voor het transposeren van de data kan men gebruik maken van de functie t(). Hierbij veranderd de kolom naar rij en de rij naar kolom. Het verandert de inhoud van de dataset niet.

# Voorbeeld output 
head(mydata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# transposeer met functie t()
newdata <- t(mydata)
# elke pati?nt is nu een kolom geworden en de variabelen zijn de rijen geworden.
newdata[ , 1:3 ]
##      [,1]     [,2]      [,3]     
## age  " 23"    " 47"     " 47"    
## na   "0.79"   "0.74"    "0.70"   
## k    "0.03"   "0.06"    "0.07"   
## sex  "man"    "vrouw"   "vrouw"  
## bp   "laag"   "normaal" "normaal"
## chol "laag"   "laag"    "laag"   
## drug "drugsY" "drugsC"  "drugsC"

Transformeren

R biedt verschillende methodes aan om de data te transformeren. Data is meestal gesorteerd op lengte (weinig kolommen en veel rijen). Het kan ook op breedte (veel kolommen en weinig rijen) worden gesorteerd. Transformeren van de data kan met de functie t() zoals hierboven beschreven en met de package reshape. Er worden drie functies hieruit besproken: melt(), cast() en reshape().

Reshape figuur

Transformatie’s met agrregratie worden bij aggregratie besproken.

Van BREED naar LANG:

# laad package reshape
library(reshape)

# Voorbeeld huidige dataframe
head(mydata)
##   age   na    k   sex      bp chol   drug
## 1  23 0.79 0.03   man    laag laag drugsY
## 2  47 0.74 0.06 vrouw normaal laag drugsC
## 3  47 0.70 0.07 vrouw normaal laag drugsC
## 4  28 0.56 0.07   man    hoog laag drugsX
## 5  49 0.79 0.05   man    hoog laag drugsY
## 6  41 0.77 0.07 vrouw normaal laag drugsC
# Transposeer met functie melt()
newdata <- melt(mydata, id.vars = c("age", "drug","sex", "bp", "chol")  )
# de variabelen die NIET genoemd worden: 'na' en 'k' worden transposed en toegevoegd aan het nieuwe datafame

# Voorbeeld nieuwe dataframe (eerste 3 en laatste 3 rijen)
head(newdata,3); tail(newdata,3)
##   age   drug   sex      bp chol variable value
## 1  23 drugsY   man    laag laag       na  0.79
## 2  47 drugsC vrouw normaal laag       na  0.74
## 3  47 drugsC vrouw normaal laag       na  0.70
##     age   drug   sex      bp chol variable value
## 350  52 drugsX vrouw    hoog laag        k  0.06
## 351  23 drugsX vrouw    hoog hoog        k  0.06
## 352  40 drugsX   man normaal hoog        k  0.06
## Het nieuwe databestand 'newdata' heeft voor elke waarde van 'na' en van 'k' een rij =  2x zoveel rijen als voorheen. Anders verwoord: de variabelen 'na' en 'k' staan nu in een kolom genaamd "variable" en de corresponderende waarde staat in een kolom genaamd "value".

# Aantal rijen oude dataframe
nrow(mydata)
## [1] 176
# Aantal rijen nieuwe dataframe
nrow(newdata)
## [1] 352

Van LANG naar BREED:

# Eerste drie een laatste drie waarden uit het dataframe
head(newdata,3); tail(newdata,3)
##   age   drug   sex      bp chol variable value
## 1  23 drugsY   man    laag laag       na  0.79
## 2  47 drugsC vrouw normaal laag       na  0.74
## 3  47 drugsC vrouw normaal laag       na  0.70
##     age   drug   sex      bp chol variable value
## 350  52 drugsX vrouw    hoog laag        k  0.06
## 351  23 drugsX vrouw    hoog hoog        k  0.06
## 352  40 drugsX   man normaal hoog        k  0.06
# Gebruik reshape() om de 'na' en 'k' terug te transformeren
olddata <- reshape(newdata, 
  timevar = "variable",
  idvar = c("age", "sex", "drug", "bp", "chol"),
  direction = "wide")

# Controleer
head(olddata,3); tail(olddata,3)
##   age   drug   sex      bp chol value.na value.k
## 1  23 drugsY   man    laag laag     0.79    0.03
## 2  47 drugsC vrouw normaal laag     0.74    0.06
## 4  28 drugsX   man    hoog laag     0.56    0.07
##     age   drug   sex      bp chol value.na value.k
## 174  52 drugsX vrouw    hoog laag     0.55    0.06
## 175  23 drugsX vrouw    hoog hoog     0.08    0.06
## 176  40 drugsX   man normaal hoog     0.68    0.06

Aggregeren

Voor het aggregeren van data (het maken van een samenvattingstabel) zijn de functies uit de reshape en reshape2 packages geschikt. De functie aggregate() is hier specifiek voor bedoeld en makkelijker in gebruik. Bijvoorbeeld:

## Voorbeeld 1: aggregeren per 1 variabele
# maak een samenvattingstabel voor de 'gemiddelde' leeftijd per drugs
aggdata_drug <- aggregate(mydata[1], mydata[7], FUN=mean, na.rm=TRUE)
aggdata_drug
##     drug      age
## 1 drugsA 35.95238
## 2 drugsB 62.42857
## 3 drugsC 42.61538
## 4 drugsX 43.78431
## 5 drugsY 44.61039
## Voorbeeld 2: aggregeren per 2+ variabele
# maak een samenvattingstabel voor de gemiddelde [na] per 'bloeddruk' en 'cholesterol' risicogroep
attach(mydata)
aggdata_bp_chol2 <- aggregate(mydata[2], by=list(bp,chol), FUN=mean, na.rm=TRUE)
detach()

# Naamgeving
names(aggdata_bp_chol2) <- c("bp","chol", "na")

# controleer nieuwe data.frame
head(aggdata_bp_chol2)
##        bp chol        na
## 1    laag laag 0.5651515
## 2 normaal laag 0.6362500
## 3    hoog laag 0.6038235
## 4    laag hoog 0.6085294
## 5 normaal hoog 0.5929032
## 6    hoog hoog 0.6110000

Samenvoegen

Het toevoegen van variabelen (kolommen) aan een database is hierboven besproken. In het geval je dataframes wilt samenvoegen (rijen toevoegen) kan dat met 2 functies: rbind() en merge().

rbind()

Om 2 dataframes verticaal aan elkaar te verbinden kan dat met rbind(). Hiervoor moeten de beide dataframes exact dezelfde variabelen hebben (niet noodzakelijk in dezelfde volgorde). Een simpel voorbeeld:

# voorbeeld rbind()
totaal <- rbind(dataframeA, dataframeB)

Indien de dataframes niet van dezelfde lengte zijn (zelfde hoeveelheid kolommen) heb je 3 opties: verwijder de extra kolommen uit dataframeA of maak de nieuwe variabelen in dataframeB en gebruik NA’s om deze variabelen te vullen. De derde optie is het gebruik van merge() om dit automatisch te doen.

merge()

Indien de dataframes niet exact dezelfde variabelen hebben kunnen ze ook samengevoegd worden met de functie merge(). Hoe de dataframes worden samengevoegd hangt af van de atributes in de merge functie, er zijn 4 manieren:

## Voorbeelden van merge()
# voeg data frame X toe aan data frame Y
data_frameY <- merge(dataframeX, dataframeY, all.y=TRUE)

# voeg twee data frames samen in een nieuwe data frame 
total <- merge(data_frameX, data_frameY, all=TRUE)

merge types


Creative Commons-Licentie Dit werk valt onder een Creative Commons Naamsvermelding - Gelijk Delen 3.0 Internationaal-licentie .