Basisvaardigheden in R: Gegevens binnen en buiten R krijgen
Gegevens importeren uit een tekstbestand met gescheiden waarden
Gebruikte dataset in voorbeelden In R kunnen we functies gebruiken waarvan de naam begint met read.
en write.
om gegevens te importeren en exporteren voor de gewenste bestandstypen. Als voornaamste voorbeeld gebruiken we meetgegevens uit een onderzoek (MAS et al, 1999) over het concentratieprofiel van de werkzame stof na orale toediening van 125 mg MDMA (beter bekend als Ecstasy of XTC). De plasmaconcentratie \(C\) - tijd \(t\) gegevens staan vermeld in de onderstaande tabel.
\(t\) (uur) |
\(C\) (µg/L) |
0.25 | 0.0 |
0.50 | 19.2 |
0.75 | 74.6 |
1.00 | 125.0 |
1.50 | 200.0 |
2.00 | 223.1 |
3.00 | 215.4 |
4.00 | 192.3 |
6.00 | 157.7 |
8.00 | 130.8 |
10.00 | 115.4 |
24.00 | 38.5 |
Gegevens invoeren vanaf het toetsenbord en naar een bestand schrijven Eerst voeren we de bovenstaande gegevens in via het toetsenbord, waarbij we met opzet de laatste rij weglaten.
Eerst stellen we de werkmap in en tonen we de bestanden die hier aanwezig zijn
> setwd("C:/temp") # stel de werkmap in > dir() # print werkmap met bestanden [1] "leeftijd.csv" "leeftijd.xlsx"
Vervolgens voeren we de bovenstaande dataset in, behalve de laatste rij, en creëren we een dataframe:
> t <- c(0.25, 0.50, 0.75, 1.00, 1.50, 2.00, 3.00, 4.00, 6.00, 8.00, 10.00) > C <- c(0, 19.2, 74.6, 125.0, 200.0, 223.1, 215.4, 192.3, 157.7, 130.8, 115.4) > df <- data.frame(t,C)
We exporteren de huidige dataset via de functie write.table()
naar het bestand MDMAdata.txt, met waarden gescheiden door een puntkomma, en met alleen kolomnamen in de eerste rij.
> write.table(df, file="MDMAdata.txt", sep=";", row.names=FALSE, col.names=TRUE)
Laten we controleren of er een nieuw bestand is gemaakt in de werkmap:
> dir() # print werkmap met bestanden [1] "age.csv" "age.xlsx" "MDMAdata.txt"
Nu voegen we meer gegevens aan het bestand toe:
> write.table(data.frame(t=24.00, C=38.5), file="MDMAdata.txt", append=TRUE,
+ sep=";", row.names = FALSE, col.names = FALSE)
Om er zeker van te zijn dat we de geëxporteerde dataset kunnen importeren en iets nieuws kunnen krijgen, verwijderen we eerst het dataframe df
uit de worskpace voordat we de dataset uit het bestand MDMAdata.txt lezen. In de functie read.table()
specificeren we alleen de bestandsnaam en het scheidingsteken, en geven we aan dat de eerste rij een header is die de kolomnamen bevat van het dataframe dat we maken op basis van de geïmporteerde gegevens.
> rm(df) > df <- read.table(file="MDMAdata.txt", header=TRUE, sep=";") > df t C 1 0.25 0.0 2 0.50 19.2 3 0.75 74.6 4 1.00 125.0 5 1.50 200.0 6 2.00 223.1 7 3.00 215.4 8 4.00 192.3 9 6.00 157.7 10 8.00 130.8 11 10.00 115.4 12 24.00 38.5
Invoer via read.table() Het bovenstaande voorbeeld toont al de belangrijkste ingrediënten van het proces van het importeren en exporteren van gegevens via een tekstbestand met gescheiden waarden. Laten we ons nu concentreren op het importeren van gegevens uit tekstbestanden met gescheiden waarden via read.table()
Deze functie leest een bestand in tabelformaat en slaat het op als een dataframe. Elke rij van de tabel verschijnt als één regel in het bestand. De syntax is
dataframe <- read.table(bestand, opties)
waarbij bestand een ASCII-bestand is met gescheiden waarden en opties parameters zijn die bepalen hoe de gegevens moeten worden verwerkt. In onderstaande tabel staan de meest voorkomende opties vermeld.
Opties van read.table()
header |
Een logische waarde die aangeeft of het bestand de namen van de variabelen op de eerste regel bevat. |
sep |
Het scheidingsteken dat waarden van gegevens scheidt. De standaardwaarde is sep="", wat één of meer spaties, tabs, nieuwe regels of regeleinden aangeeft. Gebruik sep=";" om bestanden waarin gegevens door puntkomma's gescheiden zijn in te lezen, sep="," om door komma's gescheiden bestanden te lezen, en sep="\t" om door tabs gescheiden bestanden te lezen. |
row.names |
Een optionele parameter die een of meer variabelen specificeert om rijnamen weer te geven. |
col.names |
Als de eerste rij van het gegevensbestand geen namen van variabelen bevat (header=FALSE ), kun je col.names gebruiken om een karakter vector op te geven die de namen van de variabelen bevat. Als header=FALSE en de optie col.names wordt weggelaten, krijgen variabelen de naam V1 , V2 , enzovoort. |
na.strings |
Een optionele karakter vector die codes voor ontbrekende waarden aangeeft. na.strings=c("-999", "?") converteert bijvoorbeeld elke -999 en ? waarde naar NA terwijl de gegevens worden gelezen. |
colClasses |
Een optionele vector van klassen die aan de kolommen moet worden toegewezen. colClasses=c("numeric", "character", "NULL", "numeric") leest bijvoorbeeld de eerste kolom in als numerieke waarden, leest de tweede kolom in als karakters, slaat de derde kolom over en leest de vierde kolom als numerieke waarden. Als de gegevens meer dan vier kolommen bevatten, worden de waarden in colClasses gerecycled. Wanneer je grote tekstbestanden leest, kan het gebruik van de optie colClasses de verwerking aanzienlijk versnellen. |
skip |
Het aantal regels in het gegevensbestand dat moet worden overgeslagen voordat de gegevens worden gelezen. Deze optie is handig voor het overslaan van kopteksten in het bestand. |
stringAsFactor |
logische waarde die aangeeft of karakter variabelen naar factoren moeten worden geconverteerd. Wanneer jegrote tekstbestanden verwerkt, kan het instellen van stringsAsFactors=FALSE de verwerking versnellen. |
De basis R setting biedt ook de functies read.csv()
en read.delim()
voor het importeren van rechthoekige tekstbestanden. Dit zijn eenvoudigweg wrapper-functies die read.table()
aanroepen met specifieke standaardwaarden. read.csv()
roept bijvoorbeeld read.table()
aan met header=TRUE
en sep=","
, terwijl read.delim()
de functie read.table()
aanroept met header=TRUE
en sep="\t"
(een tabulatorteken). Details vind in de read.table()
hulp.
Het pakket readr Het pakket readr
biedt een krachtig alternatief voor basis R functies voor het lezen van rechthoekige tekstbestanden. De hoofdfunctie is read_delim()
met hulpfuncties read_csv()
en read_tsv()
voor het lezen van bestanden waarin waarde respectievelijk door komma's en door tabs gescheiden zijn. Het belangrijkste voordeel van het gebruik van de invoertfuncties van dit pakket is dat ze aanzienlijk sneller zijn dan de basis R functies. Bovendien zijn ze erg goed in het raden van het juiste gegevenstype van elke kolom (numeriek, kakrakter, datum en datum-tijd). Functies in dit pakket retourneren gegevens als tibbles (dataframes met enkele gespecialiseerde kenmerken).
In onderstaand voorbeeld gebruiken we het bestand cijfers.csv, het tekstbestand met door komma's gescheiden waarden dat is gemaakt door het Excel-bestand studentcijfer.xlsx in dit formaat op te slaan. Dit Excel-blad is een fictieve lijst met cijfers van studenten voor wiskunde- en statistiekexamens.
Uitleg
Voer de volgende stappen uit:
- Download de Excelsheet cijfer.xlsx en sla deze op als csv-bestand cijfers.csv in de directory C:/temp
- Installeer de
readr
(negeer waarschuwingen) - Activeer het pakket via de
library()
. - Stel je werkmap in.
- Importeer de dataset met de functie
read_csv()
. - Bekijk de geïmporteerde dataset via het commando
View()
, verken de interne structuur via de functiestr()
, bekijk de eerste rijen van de geïmporteerde tabel via de functiehead()
, of geef gewoon het dataframe weer in het console.
Voorbeeldsessie
> install.packages("readr")
> library(readr)
> setwd("C:/temp")
> cijfers <- read_csv(file="cijfer.csv") -- Column specification --------------------- cols( studentID = col_double(), voornaam = col_character(), achternaam = col_character(), wiskunde = col_double(), statistiek = col_double() )
> View(cijfers)
> cijfers
# A tibble: 6 x 5 studentID voornaam achternaam wiskunde statistiek <dbl> <chr> <chr> <dbl> <dbl> 1 101 Jan Jansen 7.5 5 2 34 Johan Peeters 4.5 5 3 76 Jennifer Jansen 8 8.5 4 104 Daniel Smit 6 6.5 5 111 Arthur Bakker 9 9 6 83 Nadia Visser 10 9.5