|
Explorative Datenanalyse mit R The R Bootcamp |
|
from methodspace.com
In diesem Practical wirst du R’s Datenklassen besser kennenlernen und das Einlesen und Schreiben von Daten üben.
Am Ende des Practicals wirst du wissen:
Öffne dein TheRBootcamp R project. Es sollte die Ordner 1_Data und 2_Code enthalten.
Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Daten Practical” als Kommentare an den Anfang des Skripts.
## NAME
## DATUM
## Daten Practical
Speichere das neue Skript unter dem Namen daten_practical.R im 2_Code Ordner.
Lade die Pakete tidyverse, haven, und readxl. Falls eines der Pakete noch nicht installiert ist, installiere es zunächst mit install.packages("PAKETNAME"s).
# Pakete laden
library(tidyverse)
library(haven)
library(readxl)
Die folgende Tabelle zeigt die Daten von fünf hypothetischenn Baselern. Im ersten Teil dieses Practicals ist es zunächst deine Aufgabe diese Tabelle Schritt für Schritt nachzubauen.
| id | geschlecht | alter | groesse | gewicht | sex |
|---|---|---|---|---|---|
| 1 | f | 87 | 165 | F | |
| 2 | m | 54 | 175 | 86 | M |
| 3 | f | 34 | 147 | 54 | F |
| 4 | m | 31 | 166 | 105 | M |
| 5 | m | 24 | 180 | 102 | M |
id, der die id Werte der 5 Baseler Tabelle enthält. Wenn du ihn erstellt hast, printe das Vektor-Objekt. Wann immmer du XX siehst, bedeutet das, dass du etwas an dessen Stelle eintragen sollst. Siehe Tabelle.# Erstelle Vektor namens id
XX <- c(XX, XX, XX, XX, XX)
# Printe den Vektor
XX
class(), um zu überprüfen welche Klasse der id Vektor hat. Ist er numeric?# Zeige die Klasse von id
class(XX)
length() Funktion, um die Länge von id zu bestimmen. Hat er die Länge 5? Wenn nicht, stelle sicher, dass du den Vektor korrekt definiert hast.# Zeige die Länge des Vektors
length(XX)
geschlecht, der die entsprechenden Werte aus der Baseler Tabelle enthält. Stelle sicher, dass du Anführungszeichen "" um die einzelnen Elemente setzt, damit R weiss, dass es sich um character Werte handelt. Wenn du fertig bist, lasse dir den Vektor anzeigen.# Kreiere Vektor geschlecht
XX <- c("XX", "XX", "XX", "XX", "XX")
Verwende wiederum die Funktionen class() und length(), um die Klasse (character) und die Länge (5) zu überprüfen?
Führe die selben Schritte nun für die Spalten alter und groesse durch.
Schaue dir die Spalte gewicht an. Du solltest sehen, dass sie einen fehlenden Wert beinhaltet. Kreiere einen Vektor gewicht mit denselben Schritten wie zuvor. Spezifiziere den fehlenden Wert dabei als NA (ohne Anführungszeichen).
tibblestibble(), um einen data frame namens basel zu erstellen, der die eben erstellten Vektoren enthält, d.h., id, alter, geschlecht, groesse, und gewicht.# Kreiere data frame aus den Vektoren
XX <- tibble(XX, XX, XX, XX, XX, XX)
Printe den data frame. Enthält er alle Vektoren? Welche Ausmasse (Anzahl Zeilen, Spalten) hat der data frame?
Verwende die Funktion summary() um deskriptive Statistiken für die Variablen in basel zu erstellen.
Verwende den $-Operator, um allein die Variable alter zu printen.
Verwende die Funktionen mean(), max(), min(), und median() umd deskriptive Statistiken direkt für die Variable alter zu berechnen
In diesem Abschnitt importierst du den bekannten diamonds Datensatz und bearbeitest ihn.
diomands.csv Datensatz. Setze hierzu den Cursor zwischen zwei Anführungszeichen "" und drücke ⇥ (tab). Speichere den Filepath zunächst in einem eigenen Objekt namens diamonds_path.# Setze den Cursor zwischen "" und drücke tab
diamonds_path <- ""
diamonds_path in der Funktion read_csv(), um den Datensatz einzulesen und als neues Objekt diamonds zu speichern. (Der Umweg über das Objekt diamonds_path ist natürlich nicht zwingend nötig. Man kann den Filepath auch direkt als Argument einsetzen.)# Lese den diamonds Datensatz ein
diamonds <- read_csv(file = XX)
Printe den diamonds Datensatz. Inspiziere die Variablennamen. Etwas stimmt nicht, oder?
Du kannst das Problem lösen, indem du beim Einlesen einen character Vektor mit Namen dem col_names-Argument zuweist. Der Vektor soll folgende Namen enthalten: karat, cut, farbe, klarheit, tiefe, tabelle, preis.
# lese dimaonds nochmal ein, diesmal mit expliziten Spaltennamen
diamonds <- read_csv(file = XX,
col_names = c('XX','XX', ...))
Inspeziere den Datensatz. Sind die Spaltennamen nun korrekt?
Richte nun deine Aufmerksamkeit auf die Klassen der Variablen. Wurden die Klassen aller Variablen richtig inferiert?
Finde heraus was mit der karat Variable passiert ist. Wähle die karat Variable aus und schaue dir die Werte genau an. Zwischen dem 10. und 20. Eintrag solltest du eine Irregularität erkennen, die dafür verantwortlich ist, dass die Variable als character anstatt als numeric erkannt wurde.
Ersetze den falsch formatierten Wert in karat indem du unten im Code XX durch die Position (Zahl zwischen 10 und 20) des falschen Wertes ersetzt und YY mit dem korrekten Wert mit . anstatt ,.
# Ersetze den falschen Wert
diamonds$karat[XX] <- YY
karat ist immer noch character. Verwende die Funktion type_convert() um dies zu beheben. Siehe unten.# Re-inferiere Datentypen
diamonds <- type_convert(diamonds)
Printe diamonds, um sicher zu stellen, dass karat jetzt numeric ist, bzw. dbl (ein Fall von numeric).
Nachdem du nun Spaltennamen und die Klassen korrigiert hast, schreibe den Datensatz wieder auf die Festplatte als diamonds_sauber.csv mit der Funktion write_csv().
# Schreibe den sauberen diamonds Datensatz
write_csv(x = XX, path = "XX/XX.csv")
Um sicherzustellen, dass nicht wieder die selben Probleme auftreten, lese diamonds_clean.csv wieder ein und schaue dir die Spaltennamen und die Spaltentypen an. Alles in Ordnung?
Jetzt wäre der Datensatz fertig für die Analyse. Wenn du magst, exploriere ihn ein wenig. Berechne deskriptive Statistiken (mean(), median(), etc.) für die verschiedenen Variablen. Du kannst mehr über die Variablen erfahren mit ?diamonds. (Namen sind aus dem Englischen übersetzt.)
TRUE und FALSE (und NAs). Kreiere einen logischen Vektor names teuer, welcher TRUE enthält, wenn der preis des Diamanten teurer als $10,000 ist, und FALSE, wenn er günstiger ist. Siehe Code template# Kreiere Vektor teuer
ZZ <- diamonds$XX > YY
Printe den teuer Vektor. Er sollte nur TRUE und FALSE enthalten. Falls ja, decken sich die ersten Werte in preis mit den Werten in teuer?
Erweitere den Datensatz um die neue Variable teuer.
# Ergänze Vektor
XX$YY <- ZZ
Verwende die Funktion table(), um auszuzählen wie viele Diamanten teuer sind. Benutze hierzu wiederum den $-Operator um die Variable auszuwählen.
Verwende die mean() Funktion, um auszuzählen welcher Anteil teuer ist. Erinnere, mean() funktioniert auch mit logischen Vektoren.
Verwende sowohl einen logischen Vergleich, > oder <, als auch die mean() Funktion, um zu bestimmen welcher Anteil Diamanten mehr als 1 Karat besitzt.
![]()
In diesem Abschnitt liest du den ebenfalls sehr bekannten titanic Datensatz aus einem Excel Format und speicherst die Daten als .csv.
read_excel() Funktion, um den Datensatz titanic.xls als ein neues Objekt titanic einzulesen.# Lese titanic.xls
titanic <- read_excel(path = "XX")
Printe titanic und evaluiere die Ausmasse des Datensatzes mit dim().
Verwende table() um auszuzählen wie viele Leute das Unglück der Titanic überlebt haben (Variable survived).
# Wie viele haben überlebt?
table(titanic$XX)
table(), um auszuzählen wie viele Leute in jeder der einzelnen Passagierklassen (Variable pclass) das Unglück der Titanic überlebt haben.# Wie viele haben pro Passagierklasse überlebt?
table(titanic$XX, titanic$XX)
write_csv(), um den Datensatz titanic als .csv auf in deinen 1_Data Ordner zu schreiben.
In diesem Abschnitt liest du den sleep Datensatz, welcher Informationen über das Schlafverhalten der Mitarbeiter der Universität Melbourne enthält, aus einem SPSS-Format ein und speicherst die ihn im .csv-Format.
read_spss() Funktion, um den Datensatz sleep.sav als ein neues Objekt sleep einzulesen.XX <- read_spss(file = "XX")
Printe sleep und evaluiere die Ausmasse des Datensatzes mit dim(). Du wirst sehen, R war so clever die Labels der Variablen mit zu übernehmen.
Verwende die mean() Funktion um auszuzählen wie viele alkoholische Getränke die Mitarbeiter im Durchschnitt pro Tag zu sich nehmen (Variable alchohol; Typo im Originaldatensatz). Achte auf etwaige fehlende Werte!
Verwende write_csv() um den Datensatz sleep als .csv auf in deinen 1_Data Ordner zu schreiben.
library(tidyverse)
library(readxl)
library(haven)
# Kreiere Vektoren für (falsche) Aktiendaten
name <- c("apple", "microsoft", "dell", "google", "twitter")
gestern <- c(100, 89, 65, 54, 89)
heute <- c(102, 85, 72, 60, 95)
# Deskriptive Statistiken
mean(heute)
mean(gestern)
# Zeige Klassen
class(name)
class(gestern)
# Rechne mit Vektoren
change <- heute - gestern
change # Printe Resultat
# Verwende einen logischen Vektor
increase <- heute > gestern
increase # Printe Resultat
# Kreiere einen tibble aus den Vektoren
stocks <- tibble(name, gestern, heute, change, increase)
# Zeige Spaltennamen
names(stocks)
# Wähle Variablen aus
stocks$name
stocks$today
# Berechne deskriptive Werte
mean(stocks$yesterday)
median(stocks$today)
table(stocks$increase)
max(stocks$increase)
# Lese/Schreibe Delimiter-separierte Werte -------------------
# lese chickens Daten
chickens <- read_csv(file = "1_Data/chickens.csv")
# Korrigiere die Spaltennamen
chickens <- read_csv(file = "1_Data/chickens_nohead.csv",
col_names = c("weight", "time", "chick", "diet"))
# Korrigiere NA Werte beim einlesen
chickens <- read_csv(file = "1_Data/chickens_na.csv",
na = c('NA', 'NULL'))
# Schreibe saubere Daten
write_csv(x = chickens,
path = "1_Data/chickens_sauber.csv")
# Korrogiere einzelne Werte -------------------
# remove character from rating
survey$beurteilung[survey$beurteilung == "2,1"] <- 2.1
# Re-inferiere die Datentypen
survey <- type_convert(survey)
# Andere Formate -------------------
# .xlsx (Excel)
chickens <- read_excel("1_Data/chickens.xlsx")
# .sav (SPSS)
chickens <- read_spss("1_Data/chickens.sav")
| Datei | Zeilen | Spalten | Beschreibung |
|---|---|---|---|
| diamonds.csv | 100 | 7 | Bestandteil aus dem bekannten diamonds Datensatz, welcher die Eigenschaften und Preise einer grossen Anzahl Diamanten enthält. |
| titanic.xls | 1309 | 14 | Daten über die Überlebenden und Verstorbenen des Titanic Unglücks. |
| sleep.sav | 271 | 55 | Survey über das Schlafverhalten der Mitarbeiter der Universität Melbourne. |
| Paket | Installation |
|---|---|
tidyverse |
install.packages("tidyverse") |
haven |
install.packages("haven") |
readxl |
install.packages("readxl") |
Kreiere Vektoren
| Funktion | Beschreibung |
|---|---|
c("a", "b", "c") |
Kreiere character Vektor |
c(1, 2, 3) |
Kreiere numeric Vektor |
c(TRUE, FALSE, TRUE) |
Kreiere logical Vektor |
Vektor Funktionen
| Funktion | Beschreibung |
|---|---|
mean(x), median(x), sd(x), sum(x) |
Mittelwert, Median, Standardabweichung, Summe |
max(x), min(x) |
Maximum, Minimum |
table(x) |
Höufigkeitstabelle |
Zugriff auf Variablen in Data Frames
| Funktion | Beschreibung |
|---|---|
df$name |
Greife auf Variable (Vektor) name aus dem data frame df zu |
Lese/Schreibe Textdateien
| Dateiendung | Dateityp | Lesen | Schreiben |
|---|---|---|---|
.csv |
Komma-separierte Textdatei | read_csv(file) |
write_csv(x, file) |
.csv |
Semi-colon separierte Textdatei | read_csv2(file) |
not available |
.txt |
Andere Textdatei | read_delim(file) |
write_delim(x, file) |
Lese/Schreibe andere Formate
| Dateiendung | Dateityp | Lesen | Schreiben |
|---|---|---|---|
.xls, .xlsx |
Excel | read_excel(file) |
xlsx::write.xlsx() |
.sav |
SPSS | read_spss(file) |
write_spss(x, file) |
Kreiere data frames
| Function | Description |
|---|---|
tibble(a, b, c) |
Kreiere tibble data frame mit den Vektoren a, b, c |
tibbles, Daten Lesen und Schreiben schaut euch Grolemund`s und Wickham’s R for Data Science an.