GNU R: Daten selektieren
Daten auswählen
BearbeitenSehr oft möchte man nicht alle Daten aus einer eingelesenen Datei verarbeiten, sondern nur Teile davon. Hier bietet R elegante Lösungen basierend auf Rs sehr flexiblen Parameterverarbeitung.
InhaltsverzeichnisBearbeiten
|
Extrahieren von Spalten aus einer Tabelle
BearbeitenProblem 1
BearbeitenIch habe ein Tabelle und möchte nun diese Tabelle reduzieren. Es sollen nur die Spalten ausgewählt werden, die mit den Buchstaben "Row" anfangen.
Lösung 1
BearbeitenWir verwenden als Beispiel mit eine kleine Tabelle, um das Prinzip der Selection deutlich zu machen (siehe CSV-Beispieldatei data.csv[1]):
name | aufgabe1 | aufgabe2 | aufgabe3 | punkte |
---|---|---|---|---|
Anna | 10 | 15 | 13 | 38 |
Bert | 3.5 | 13 | 0 | 16.5 |
Camilla | 12 | 8 | 15 | 35 |
Dieter | 5 | 6 | 7 | 18 |
Emilia | 15 | 15 | 14.5 | 44.5 |
Friedrich | 11 | 12 | 4 | 27 |
Mit dem dim kann man die Dimension der Tabelle (dataframe) überprüfen.
> dim(studentdata) [1] 6 5
Die Originaltabelle mit 6 Zeilen und 5 Spalten. Nun wollen wir die Spalten extrahieren, die mit dem Prefix "aufgabe" beginnen.
log4aufgaben <- grepl("aufgabe", colnames(studentdata))
Mit dem logischen grep-Befehl grepl erhält man eine Vektor mit boolschen Variable "TRUE" bzw. "FALSE", wobei der Wahrheitswert angibt, ob der Spaltennamen mit "aufgabe beginnt.
name | aufgabe1 | aufgabe2 | aufgabe3 | punkte |
---|---|---|---|---|
FALSE | TRUE | TRUE | TRUE | FALSE |
Mit dem normalen grep-Befehl (ohne "l" am Ende) erhält man die Spaltenindizes, die mit "aufgabe" beginnen.
index4aufgaben <- grep("aufgabe", colnames(studentdata))
Als Resultat erhält man einen Vektor mit 3 Einträgen
2 | 3 | 4 |
Wenn man nun die Anzahl der Aufgaben in einer Tabelle bestimmen möchte, muss man nur die Länge des Indexvektors "index4aufgaben" berechnen
aufgabenanzahl <- length(index4aufgaben)
Nun extrahieren wir alle Spalten, die die Punkte für einzelne Aufgaben enthält.
nur_aufgaben <- studentdata[ , index4aufgaben]
Die Tabelle nur_aufgaben enthält nur die Spalten mit Aufgabenpunkten und reduziert damit Ausgangstabelle auf die mit "grep" gefundenen Indizes.
aufgabe1 | aufgabe2 | aufgabe3 |
---|---|---|
10 | 15 | 13 |
3.5 | 13 | 0 |
12 | 8 | 15 |
5 | 6 | 7 |
15 | 15 | 14.5 |
11 | 12 | 4 |
Wenn wir nun die Dimension des resultierenden Dataframes/Tabelle untersuchen, erhält man 6 Zeilen und 3 Spalten.
> dim(nur_aufgabe) [1] 6 3
Extrahieren von Spalten mit Spaltennamen
BearbeitenProblem 2
BearbeitenGegeben ist ein Tabelle (Dataframe) mit bekannten Spaltenüberschriften (column names) und möchte nun aus dieser Tabelle einzelne Spalten, die in einem speziellen Anwendungsfall von Interesse sind, zu einer neuen Tabelle zusammenzufassen.
CSV-Datei - Dataframe 2
Bearbeitenname , aufgabe1 , aufgabe2 , aufgabe3 , summe Anna , 10 , 15, 13 , 38 Bert , 3.5 , 13, 0 , 16.5 Camilla , 12 , 8 , 15 , 35 Dieter , 5 , 6 , 7 , 18 Emilia 15 , 15 , 14.5 , 44.5
Die obige Datei wird in einen Dataframe geladen:
studentdata <- read.csv("klausur.csv", header=TRUE, stringsAsFactors=FALSE)
Lösung 2
BearbeitenMan erstellt zunächst eine neue Tabelle in dem nur der Name der Person und die erreichte Punktzahl in der Klausur enthalten ist.
name <- studentdata$name
summe <- studentdata$summe
klausur_ergebnis <- data.frame(name,summe)
Die erzeugte Tabelle hat zwei Spalten mit dem Namen "name" und "summe". Wenn man diesen Dataframe wieder in eine CSV-Datei speichert, erhält man folgende CSV-Datei mit dem Namen "klausurergebnis.csv" mit folgenden Befehl.
write.csv(studentdata, "datasumme.csv", row.names = FALSE)
Die Tabelle hat dann die folgenden Spaltenstruktur.
"name" , "summe" "Anna" , 38 "Bert" , 16.5 "Camilla" , 35 "Dieter" , 18 "Emilia" , 44.5
Quellennachweis
Bearbeiten- ↑ Bert Niehaus (2023) data.csv GitHub-Repository KnitR for Education https://github.com/niebert/knitr4education für eine Wikiversity-Lernressource - Datei: data.csv