Basisvaardigheden in R: Gegevens binnen en buiten R krijgen
Data combineren en opschonen
Creatie van twee datasets voor de voorbeelden We beginnen weer met het creëren van een fictieve dataset van tentamencijfers van studenten en schrijven de gegevens met de functie write.table()
weg naar een csv bestand.
> studentID <- c(101, 34, 76, 104, 111, 83) > voornaam <- c("Jan", "Johan", "Carla", "Daniel", "Bert", "Nadia") > achternaam <- c("Jansen", "Peeters", "Jansen", "Smit", "Bakker", "Visser") > wiskunde <- c(7.5, 4.5, 8, 5.5, 9, 10) > statistiek <- c(5, 5, 8.5, 6.5, 99, 9.5) > df_cijfers <- data.frame(studentID, voornaam, achternaam, wiskunde, statistiek) > setwd("C:/temp") > write.table(df_cijfers, file="cijfers.csv", sep = ",")
We maken ook nog een dataset van herkansingscijfers van studenten en schrijven deze gegevens naar een tweede csv bestand weg.
> studentID <- c(101, 34, 76, 104, 111, 83, 55)
> herkansing <- c(7, 6, NA, NA, NA, NA, 8) > df_herkansing <- data.frame(studentID, herkansing) > write.table(df_herkansing, file="cijfers_herkansing.csv", sep = ",")
Dataframes samenvoegen We veronderstellen dat de twee dataframes geïmporteerd zijn of uit bovenstaande sessie komen.
> df_cijfers studentID voornaam achternaam wiskunde statistiek 1 101 Jan Jansen 7.5 5.0 2 34 Johan Peeters 4.5 5.0 3 76 Carla Jansen 8.0 8.5 4 104 Daniel Smit 5.5 6.5 5 111 Bert Bakker 9.0 99.0 6 83 Nadia Visser 10.0 9.5 > df_herkansing studentID herkansing 1 101 7 2 34 6 3 76 NA 4 104 NA 5 111 NA 6 83 NA 7 55 8
Je kunt de twee dataframes samenvoegen op basis van de gemeenschappelijke kolom via de functie merge()
.
> alle_cijfers <- merge(df_cijfers, df_herkansing, by="studentID") > alle_cijfers studentID voornaam achternaam wiskunde statistiek herkansing 1 34 Johan Peeters 4.5 5.0 6 2 76 Carla Jansen 8.0 8.5 NA 3 83 Nadia Visser 10.0 9.5 NA 4 101 Jan Jansen 7.5 5.0 7 5 104 Daniel Smit 5.5 6.5 NA 6 111 Bert Bakker 9.0 99.0 NA
Merk op dat we alleen rijen samenvoegen die een gemeenschappelijke waarde voor studentID
hebben. Willen we echt alles in één dataframe samenvoegen, dan moeten we de optie All=TRUE gebruiken.
> merge(df_cijfers, df_herkansing, by="studentID", all=TRUE) studentID voornaam achternaam wiskunde statistiek herkansing 1 34 Johan Peeters 4.5 5.0 6 2 55 <NA> <NA> NA NA 8 3 76 Carla Jansen 8.0 8.5 NA 4 83 Nadia Visser 10.0 9.5 NA 5 101 Jan Jansen 7.5 5.0 7 6 104 Daniel Smit 5.5 6.5 NA 7 111 Bert Bakker 9.0 99.0 NA
Uitbijters verwijderen We gaan verder met de variabele alle.cijfers
uit het vorige voorbeeld.
> alle_cijfers studentID voornaam achternaam wiskunde statistiek herkansing 1 34 Johan Peeters 4.5 5.0 6 2 76 Carla Jansen 8.0 8.5 NA 3 83 Nadia Visser 10.0 9.5 NA 4 101 Jan Jansen 7.5 5.0 7 5 104 Daniel Smit 5.5 6.5 NA 6 111 Bert Bakker 9.0 99.0 NA
In de kolom met statistiekcijfers zie een cijfer 99 staan; dit kan niet op een schaal van 1 tot 10 en daarom is het gewenst deze uitbijter te verwijderen. Dit kan als volgt in dit voorbeeld:
> opgeschoonde_cijfers <- alle.cijfers[alle_cijfers$statistiek <= 10, ] > opgeschoonde_cijfers studentID voornaam achternaam wiskunde statistiek herkansing 1 34 Johan Peeters 4.5 5.0 6 2 76 Carla Jansen 8.0 8.5 NA 3 83 Nadia Visser 10.0 9.5 NA 4 101 Jan Jansen 7.5 5.0 7 5 104 Daniel Smit 5.5 6.5 NA
Dubbele gegevens verwijderen We gaan verder met de variabele opgeschoonde_cijfers
uit het vorige voorbeeld. We voegen een eerdere rij toe zodat er in de dataset een rij twee keer voorkomt.
> N.Visser <- opgeschoonde_cijfers[3,] > gedupliceerde_data <- rbind(opgeschoonde_cijfers, N.Visser) > gedupliceerde_data studentID voornaam achternaam wiskunde statistiek herkansing 1 34 Johan Peeters 4.5 5.0 6 2 76 Carla Jansen 8.0 8.5 NA 3 83 Nadia Visser 10.0 9.5 NA 4 101 Jan Jansen 7.5 5.0 7 5 104 Daniel Smit 5.5 6.5 NA 31 83 Nadia Visser 10.0 9.5 NA
De functie duplicated()
maakt een logische vector waarin de waarde TRUE elementen van een vector of rijen van een dataframe aanduiden die eerder voor komen in het object. Je kunt deze functie daarna ook gebruiken om dubbele gegevens te verwijderen. In ons voorbeeld:
> duplicated(gedupliceerde_data) [1] FALSE FALSE FALSE FALSE FALSE TRUE
> which(duplicated(gedupliceerde_data)) # welke dubbele rij(en)? [1] 6
> schone_cijfers <- gedupliceerde_data[!duplicated(gedupliceerde_data), ]
> schone_cijfers
studentID voornaam achternaam wiskunde statistiek herkansing
1 34 Johan Peeters 4.5 5.0 6
2 76 Carla Jansen 8.0 8.5 NA
3 83 Nadia Visser 10.0 9.5 NA
4 101 Jan Jansen 7.5 5.0 7
5 104 Daniel Smit 5.5 6.5 NA