Oefenvragen R

Meer ervaring opdoen met R

Oefening 1 (Volgorde)

Onder deze tekst staat een stukje code. Neem deze over in Rstudio (tip: je kan de hele code in 1 keer kopiëren met het knopje rechtsboven).

# waarden instellen
a <- 2.5
b <- 11
c <- 0.01

# bereken de uitkomst
uitkomst <- a/b+a*(c+a)

a. Voeg aan het einde van een script een extra regel toe, waar je de variabele a in 5 verandert.
b. Voer het script uit. De waarde van de uitkomst-variabele is niet veranderd. Leg met de kook-analogie uit waarom niet.

Oefening 2 (Rekenen in een loop)

a. Schrijf een stukje R-code die een variabele x op 14 laat beginnen, en er daarna 2,3 bij optelt.

b. In plaats van slechts één keer 2,3 bij x op te tellen, gaan we dit een groot aantal keren doen. Breid je script uit door een for-loop te schrijven die 100 keer 2,3 bij x optelt.

c. Definieer een variabele n <- 50, en zorg dat de loop niet 100 keer, maar n keer 2,3 bij de beginwaarde van x optelt.

d. Deel na het optellen ook x door 1,5. Als je n op 50 laat staan, hoe groot is x dan na het uitvoeren van je loop?

e. Zet n nu op 100. Welke waarde heeft x nu?

f. Print elke stap de waarde van x, en vergelijk hiermee de antwoorden van vraag d en e met elkaar. (hint: gebruik cat('In stap', i, 'is de waarde van x', x, '\n'), ervanuit gaande dat je i als teller gebruikt in je for-loop)

Oefening 3 (Tabellen inlezen en plotten)

a. Ga naar https://tbb.bio.uu.nl/bvd/bms/data, en klik op txt-bestand covid.txt. Bekijk de inhoud van dit plain text bestand. Hoeveel kolommen bevat deze data? Is dit een CSV file? (hint: zoek op waar CSV voor staat).

b. Bekijk de onderstaande code, en neem deze over. Tel het aantal rijen met nrow. Zijn dit er 52 zoals in het bestand? Tel ook het aantal kolommen met ncol. Klopt dit?

# Lees het bestand covid.txt op de website in met 'read.table'
covid <- read.csv("http://tbb.bio.uu.nl/bvd/bms/data/covid.txt")
View(covid)

c. Om de kolommen goed in te lezen, kunnen we read.table gebruiken (deze gaat ervan uit dat de data is gescheiden door spaties). De onderstaande code gebruikt read.table. Bekijk nogmaals zorgvuldig de ingelezen tabel Is de data goed ingelezen?

# Lees het bestand covid.txt op de website in met 'read.table'
covid <- read.table("http://tbb.bio.uu.nl/bvd/bms/data/covid.txt")

d. We passen read.table nog iets verder aan om ervoor te zorgen dat de eerste rij wordt gezien als de header (de namen van de kolommen). De data wordt nu goed ingelezen. Bereken hoeveel positieve testen er gedurende deze periode gemiddeld waren.

# Lees het bestand covid.txt op de website in met 'read.table' en header=T
covid <- read.table("http://tbb.bio.uu.nl/bvd/bms/data/covid.txt",header=T)
head(covid)

e. De laatste regel van bovenstaande code gebruikt head om de eerste 5 regels van de covid-tabel te laten zien. Gebruik de hulpfunctie van Rstudio (?head) en pas de code aan zodat het de eerste 12 rijen van de dataframe laat zien.


f. De functie str kan de structuur van een data frame samenvatten. Gebruik str om te bepalen hoeveel rijen/kolommen de covid-dataframe heeft, en welk type variabele er in elke kolom staat.

Om de data beter te kunnen bekijken kunnen we op allerlei manieren plotten. Laten we het aantal positieve testen over de tijd weergeven. Hiervoor gebruiken we de functie plot(). Deze functie heeft veel opties, maar in de basis heeft het alleen twee dingen nodig: een lijst met getallen voor op de x-as, en een lijst met getallen voor op de y-as. Zodoende kunnen we gemakkelijk een plotje maken (zie code hieronder).

# Lees het bestand covid.txt op de website in met 'read.table'
covid <- read.table("http://tbb.bio.uu.nl/bvd/bms/data/covid.txt",header=T)

x <- covid$datapunt # alle x-punten in een vector
y <- covid$positieve_testen # alle y-punten in een vector
plot(x,y) # basisplot: alle x-punten tegen alle y-punten
plot(x,y, type='b',lwd=2,
     xlab="Datapunt", ylab="Aantal positieve testen",
     col="darkblue", main="Aantal positieve Covid-19 testen in Utrecht") # allerlei extra opties om de plot mooi te maken

# Zoals je hierboven ziet kun je een functie-aanroep (hier 'plot')
# ook over meerdere regels verdelen. R weet dat de functie pas 'af' 
# is als je het haakje sluit. 

g. Stel dat we alleen geïntresseerd zijn in week 14 t/m 19. Neem de code hierboven over, en pas deze aan zodat je alleen week 14 t/m 19 plot. Tip: maak een nieuw dataframe genaamd covid_subset waarin alleen deze weken voorkomen. Gebruik dan dezelfde plot-functie als hierboven voor deze dataset. Plot de data ook een keer op een log-lineaire schaal door log="y" toe te voegen aan de plot-opties. Wat valt je op?

h. Het zou ook zo kunnen zijn dat je alleen in 2021 geïnteresseerd bent. Kijkende naar de data frame zijn dit de eerste 15 rijen, dus deze zouden we kunnen selecteren met covid[1:15,]. Met grote tabellen kan het echter handig zijn om dit automatisch te doen (zie voorbeeld-code hieronder). Pas deze code aan om alle rijen punten met meer dan 1000 positieve testen te selecteren.
Bonus: voeg de datapunten met meer dan 1000 positieve testen toe aan de bestaande grafiek door (na de eerste keer plot() te gebruiken) de functie points() te gebruiken. Deze verwacht net als plot een serie x- en y-waarden, maar voegt deze nu toe aan de bestaande plot.

covid_subset <- covid[covid$jaar == 2021,]
x <- covid_subset$datapunt # alle x-punten in een vector
y <- covid_subset$positieve_testen # alle y-punten in een vector

plot(x,y, type='b',lwd=2, log="y",
     xlab="Datapunt", ylab="Aantal positieve testen (log-schaal)",
     col="darkblue", main="Aantal positieve Covid-19 testen in Utrecht") # 

Oefening 4 (Condities en loops)
Je hebt geleerd dat je met een for-loop een bepaalde handeling kan herhalen. Bekijk de onderstaande for-loop.

for(i in 1:12){
  dobbelsteen <- sample(1:6,1) # getal van 1 t/m 6 (dobbelsteen worp)
  cat(paste("Worp nummer",i,"is",dobbelsteen,"\n")) #\n staat voor een 'enter'
}

a. De cat functie geeft de gecompileerde zinnetjes weer in de terminal. Dit wordt in de programmeer-wereld printen genoemd. Met een dobbelsteen heb je 50% kans om 4, 5 of 6 te gooien. Pas de bovenstaande code aan zodat er alleen iets wordt geprint als er 4, 5 of 6 is gegooid. Is het aantal iedere keer precies 50% van het aantal pogingen? Waarom wel/niet?

Stel dat we het bovenstaande experiment van 12 keer een dobbelsteen rollen 100 keer uit willen voeren (honderd replicas). Om dit te doen kunnen we de bestaande for-loop zelf in een for-loop zetten. Dit heet het nesten van code. Zo kunnen we bijvoorbeeld bijhouden hoe vaak we precies 1 keer zes gooien, als we herhaaldelijk 12 keer een dobbelsteen rollen (zie code hieronder)

for(e in 1:100){
  aantal_keren_6 <- 0
  for(i in 1:12){
    dobbelsteen <- sample(1:6,1) # getal van 1 t/m 6 (dobbelsteen worp)
    if(dobbelsteen ==6) aantal_keren_6 <- aantal_keren_6 + 1
  }
}

b. Pas de bovenstaande code aan, zodat er aan het einde van elk experiment “Hoera!” wordt geprint als er precies 1 keer 6 is gegooid. Kun je de code aanpassen zodat je kan bijhouden hoe vaak dit is gebeurd?

Oefentoets R

Oefening 5

a.Wat is het verschil tussen een matrix en een data frame?

b. Welk type variabele is x in de code x <- "123"?

c. Als je de code x <- seq(1,10,by=0.5) uitvoert, wat is dan de waarde van x[2]?

d. Als je de code x <- 10:1 uitvoert, wat is dan de waarde van x[1]?

e. Als je de code x <- runif(10) uitvoert, wat is dan de waarde van x[1]? En wat geeft x[11] dan?

f. Beschouw het volgende data frame:

df <- data.frame(naam = c("Jaap", "Alina", "Xin"),
                 minuten = c(12, 19, 11), 
                 score = c(85, 90, 95))

Stel we willen een nieuwe kolom toevoegen die de score per minuut geeft, wat moeten we daarvoor doen?

g. Een student leest de volgende csv in van dieren in het asiel onder de naam “dieren”:

Naam, Leeftijd, Vachtkleur, Temperament
Joey, 8, zwart, rustig
Roos, 2, wit, energiek
Bob, 4, bruin, vriendelijk
Saartje, 2, gevlekt, verlegen

Wat geeft de selectie dieren[2,3:4] terug?

h. Bekijk de onderstaande for-loop. Wat wordt er na de for-loop geprint?

a <- 1
for(i in 1:3){
  a <- a + i
}
cat("De waarde van a is:",a)

i. Match de onderstaande variabelen of datastructuren met hun omschrijving

  1. Numeric
  2. Character / string
  3. Logical
  4. Vector
  5. Matrix
  6. Data frame
  1. Een lijst van variabelen van hetzelfde type
  2. Eén of meerdere letters, bijvoorbeeld ‘ATAGAC’ of ‘groen’
  3. Een getal
  4. Een tabel van variabelen van hetzelfde type
  5. Of iets waar/onwaar is (TRUE/FALSE, 1/0)
  6. Een tabel van variabelen met voor elke kolom (mogelijk) een ander type

j. Welk van de onderstaande stukjes code maakt niet een vector van getallen van 1:10?

  1. c(1:10)
  2. seq(1, 10)
  3. 1:10
  4. c(1,10)

k. Als je een vector hebt x <- c(2, 4, 6, 8), hoe haal je het derde element op?
a) x(3)
b) x[3]
c) x[3,] d) x[,3]

l. Wat is het resultaat van 3 > 5 in R?
a) TRUE
b) FALSE
c) NA
d) NULL

m. Als x <- c(10, 20, 30, 40), wat geeft x >= 20 dan terug?

  1. FALSE FALSE TRUE TRUE
  2. TRUE TRUE FALSE FALSE
  3. TRUE FALSE FALSE FALSE
  4. FALSE TRUE TRUE TRUE
  5. 30, 40
  6. 10, 20
  7. 10
  8. 20, 30, 40

n. Als x <- c(10, 20, 30, 40), wat geeft x[x >= 20] dan terug?

  1. FALSE FALSE TRUE TRUE
  2. TRUE TRUE FALSE FALSE
  3. TRUE FALSE FALSE FALSE
  4. FALSE TRUE TRUE TRUE
  5. 30, 40
  6. 10, 20
  7. 10
  8. 20, 30, 40