Trulli
from methodspace.com

Überblick

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:

  1. Wie man mit Data Frames und Vektoren umgeht.
  2. Wie man Daten verschiedener Formate einliest und schreibt.

Aufgaben

A - Setup

  1. Öffne dein TheRBootcamp R project. Es sollte die Ordner 1_Data und 2_Code enthalten.

  2. Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Daten Practical” als Kommentare an den Anfang des Skripts.

## NAME
## DATUM
## Daten Practical
  1. Speichere das neue Skript unter dem Namen daten_practical.R im 2_Code Ordner.

  2. Lade die tidyverse, haven, und readxl Pakete. 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)
# Pakete laden
library(tidyverse)
library(haven)
library(readxl)

B - Kreiere Vektoren

Die folgende Tabelle zeigt die Daten von fünf hypothetischenn Baselern. Im ersten Teil dieses Practicals ist es deine Aufgabe diese Tabelle schritt für schritt nachzubauen und anschliessend zu analysieren. Wann immmer du XX siehst, bedeutet das, dass du etwas an dessen Stelle eintragen sollst.

5 Baseler

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
  1. Erstelle einen numerischen Vektor genannt id, der die id Werte der 5 Baseler Tabelle enthält. Wenn du ihn erstellt hast, printe das Vektor-Objekt.
# Erstelle Vektor namens id
XX <- c(XX, XX, XX, XX, XX)

# Printe den Vektor
XX
# Erstelle Vektor namens id
id <- 1:5 

# Printe den Vektor
id
[1] 1 2 3 4 5
  1. Verwende die Funktion class(), um zu überprüfen welche Klasse der id Vektor hat. Ist er numeric?
# Zeige die Klasse von id
class(XX)
# Zeige die Klasse von id
class(id)
[1] "integer"
  1. Verwende die 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)
# Zeige die Länge des Vektors
length(id)
[1] 5
  1. Kreiere einen Vektor geschlecht, der die entsprechenden Werte aus der 5 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")
# Kreiere Vektor geschlecht 
geschlecht <- c("m", "m", "f", "m", "m")

# Zeige den Vektor
geschlecht
[1] "m" "m" "f" "m" "m"
  1. Verwende wiederum die Funktionen class() und length(), um die Klasse (character) und die Länge (5) zu überprüfen?
# Zeige die Klasse und die Länge von geschlecht
class(geschlecht)
[1] "character"
length(geschlecht)
[1] 5
  1. Führe die selben Schritte nun für die Spalten alter und groesse aus.
# Kreiere Vektor alter
alter <- c(44, 65, 31, 27, 24)

# Zeige Vektor alter
alter
[1] 44 65 31 27 24
# Zeige Klasse von Vektor alter
class(alter)
[1] "numeric"
# Zeige Länge von Vektor alter
length(alter)
[1] 5
# Kreiere Vektor groesse
groesse <- c(174, 180, 168, 209, 177)

# Zeige Vektor groesse
groesse
[1] 174 180 168 209 177
# Zeige Klasse von Vektor groesse
class(groesse)
[1] "numeric"
# Zeige Länge von Vektor groesse
length(groesse)
[1] 5
  1. Schaue dir die Spalte gewicht an. Du wirst 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.
# Kreiere Vektor gewicht
gewicht <- c(113, 75, 56, 934, NA)

# Zeige Vektor gewicht
gewicht
[1] 113  75  56 934  NA
# Zeige Klasse von Vektor gewicht
class(gewicht)
[1] "numeric"
# Zeige Länge von Vektor gewicht
length(gewicht)
[1] 5

C - Kreiere tibbles

  1. Verwende die Funktion tibble(), um einen data frame namens basel zu erstellen, der die eben erstellten Vektoren enthält: id, alter, geschlecht, groesse, und gewicht.
# Kreiere data frame aus den Vektoren
XX <- tibble(XX, XX, XX, XX, XX, XX) 
# Kreiere data frame aus den Vektoren
basel <- data.frame(id, alter, geschlecht, groesse, gewicht) 
  1. Printe den data frame. Enthält er alle Vektoren? Welche Ausmasse (Anzahl Zeilen, Spalten) hat der data frame?
# Print basel
basel
  id alter geschlecht groesse gewicht
1  1    44          m     174     113
2  2    65          m     180      75
3  3    31          f     168      56
4  4    27          m     209     934
5  5    24          m     177      NA
  1. Verwende die Funktion summary() um deskriptive Statistiken für die Variablen in basel zu erstellen.
# Zeige deskriptive Statistiken
summary(basel)
       id        alter       geschlecht           groesse       gewicht   
 Min.   :1   Min.   :24.0   Length:5           Min.   :168   Min.   : 56  
 1st Qu.:2   1st Qu.:27.0   Class :character   1st Qu.:174   1st Qu.: 70  
 Median :3   Median :31.0   Mode  :character   Median :177   Median : 94  
 Mean   :3   Mean   :38.2                      Mean   :182   Mean   :294  
 3rd Qu.:4   3rd Qu.:44.0                      3rd Qu.:180   3rd Qu.:318  
 Max.   :5   Max.   :65.0                      Max.   :209   Max.   :934  
                                                             NA's   :1    
  1. Verwende den $-Operator, um allein die Variable alter zu printen.
# Printe alter
basel$XX
# Printe alter
basel$alter
  1. Verwende die Funktionen mean(), max(), min(), und median() umd deskriptive Statistiken direkt für die Variable alter zu berechnen
# Deskriptive Statistiken für alter
mean(basel$alter)
median(basel$alter)
max(basel$alter)
min(basel$alter)

D - Lesen und Schreiben von Delimiter-separierten Dateien

In diesem Abschnitt wirst du den bekannten diamonds Datensatz einlesen und bearbeiten.

  1. Finde den Filepath zum 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 <- ""
# Setze den Cursor zwischen "" und drücke tab
diamonds_path <- "1_Data/diamonds.csv"
  1. Jetzt verwende das Objekt 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)
# Lese den diamonds Datensatz ein
diamonds <- read_csv(file = diamonds_path)
Parsed with column specification:
cols(
  `0.8` = col_character(),
  `Very Good` = col_character(),
  H = col_character(),
  VVS1 = col_character(),
  `62.9` = col_double(),
  `58` = col_double(),
  `4468` = col_double()
)
  1. Printe den diamonds Datensatz. Inspiziere insbesondere die Variablennamen. Etwas stimmt nicht, oder?
# Print diamonds
diamonds
# A tibble: 99 x 7
   `0.8` `Very Good` H     VVS1  `62.9`  `58` `4468`
   <chr> <chr>       <chr> <chr>  <dbl> <dbl>  <dbl>
 1 0.74  Ideal       H     IF      60.9    57   3760
 2 2.03  Premium     I     SI1     61.4    58  15683
 3 0.41  Ideal       G     VVS1    62.1    55   1151
 4 1.54  Premium     G     VS1     61.1    56  14438
 5 0.3   Ideal       E     VS2     61.8    55    795
 6 0.3   Ideal       H     VVS2    61.5    56    605
 7 1.2   Ideal       D     SI1     61.8    58   7508
 8 0.58  Ideal       E     VS2     62.3    54   1809
 9 0.31  Ideal       H     VS2     62.6    57    489
10 1.24  Very Good   F     VS1     59      60   9885
# … with 89 more rows
  1. Du kannst das Problem lösen, indem du direkt 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','...'))  
# lese dimaonds nochmal ein, diesmal mit expliziten Spaltennamen
diamonds <- read_csv(file = diamonds_path,
                     col_names = c("karat", "cut", "farbe", "klarheit", "tiefe", "tabelle", "preis"))
Parsed with column specification:
cols(
  karat = col_character(),
  cut = col_character(),
  farbe = col_character(),
  klarheit = col_character(),
  tiefe = col_double(),
  tabelle = col_double(),
  preis = col_double()
)
  1. Re-inspeziere den Datensatz. Sind die Spaltennamen nun korrekt?
# print diamonds
diamonds
# A tibble: 100 x 7
   karat cut       farbe klarheit tiefe tabelle preis
   <chr> <chr>     <chr> <chr>    <dbl>   <dbl> <dbl>
 1 0.8   Very Good H     VVS1      62.9      58  4468
 2 0.74  Ideal     H     IF        60.9      57  3760
 3 2.03  Premium   I     SI1       61.4      58 15683
 4 0.41  Ideal     G     VVS1      62.1      55  1151
 5 1.54  Premium   G     VS1       61.1      56 14438
 6 0.3   Ideal     E     VS2       61.8      55   795
 7 0.3   Ideal     H     VVS2      61.5      56   605
 8 1.2   Ideal     D     SI1       61.8      58  7508
 9 0.58  Ideal     E     VS2       62.3      54  1809
10 0.31  Ideal     H     VS2       62.6      57   489
# … with 90 more rows
  1. Richte nun deine Aufmerksamkeit auf die Klassen der Variablen. Wurden die Klassen aller Variablen richtig interpretiert?

  2. Finde heraus was 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 erkannt wurde.

# Zeige die Variable Karat
diamonds$karat
  [1] "0.8"  "0.74" "2.03" "0.41" "1.54" "0.3"  "0.3"  "1.2"  "0.58" "0.31"
 [11] "1.24" "0.91" "1.28" "0.31" "1.02" "1"    "0,37" "0.55" "0.54" "0.34"
 [21] "0.91" "0.9"  "0.5"  "0.31" "1.66" "0.47" "0.3"  "0.7"  "1.72" "0.41"
 [31] "1.06" "0.32" "0.4"  "0.71" "0.3"  "1.31" "1.08" "0.45" "0.3"  "0.62"
 [41] "1.01" "2"    "0.38" "2.03" "1"    "0.38" "0.41" "0.49" "0.71" "1.51"
 [51] "1.02" "1.3"  "0.32" "1.52" "0.59" "1.31" "1.05" "1.08" "0.43" "1.08"
 [61] "0.3"  "0.4"  "0.52" "0.41" "1"    "0.33" "0.75" "0.26" "0.34" "1.49"
 [71] "0.3"  "0.4"  "0.71" "0.92" "0.7"  "0.55" "1.47" "0.42" "0.58" "0.44"
 [81] "0.31" "0.3"  "0.55" "0.41" "0.31" "0.33" "0.32" "2.67" "0.88" "0.57"
 [91] "0.36" "0.53" "0.79" "0.9"  "0.31" "1.03" "0.39" "0.51" "0.34" "0.25"
  1. 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
# Ersetze den falschen Wert
diamonds$karat[17] <- 0.37
  1. Jetzt hast du den Wert ausgebessert, aber karat ist immer noch vom Typ character. Verwende die Funktion type_convert() um dies zu beheben. Siehe unten.
# Re-inferiere Datentypen
diamonds <- type_convert(diamonds)
Parsed with column specification:
cols(
  karat = col_double(),
  cut = col_character(),
  farbe = col_character(),
  klarheit = col_character()
)
  1. Printe diamonds, um sicher zu stellen, dass karat jetzt numeric ist, bzw. dbl (ein Typ von numeric).
# Zeige diamonds
diamonds
# A tibble: 100 x 7
   karat cut       farbe klarheit tiefe tabelle preis
   <dbl> <chr>     <chr> <chr>    <dbl>   <dbl> <dbl>
 1 0.8   Very Good H     VVS1      62.9      58  4468
 2 0.74  Ideal     H     IF        60.9      57  3760
 3 2.03  Premium   I     SI1       61.4      58 15683
 4 0.41  Ideal     G     VVS1      62.1      55  1151
 5 1.54  Premium   G     VS1       61.1      56 14438
 6 0.3   Ideal     E     VS2       61.8      55   795
 7 0.3   Ideal     H     VVS2      61.5      56   605
 8 1.2   Ideal     D     SI1       61.8      58  7508
 9 0.580 Ideal     E     VS2       62.3      54  1809
10 0.31  Ideal     H     VS2       62.6      57   489
# … with 90 more rows
  1. Nachdem du nun die Spaltennamen und die Klassen behoben hast, schreibe den Datensatz wieder auf die Festplatte unter diamonds_sauber.csv mit der Funktion write_csv().
# Schreibe den sauberen diamonds Datensatz 
write_csv(x = XX, path = "XX/XX.csv")
# Schreibe den sauberen diamonds Datensatz 
write_csv(x = diamonds, "1_Data/diamonds_sauber.csv")
  1. 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?
# Lese den sauberen diamonds Datensatz ein
diamonds_clean <- read_csv(file = "1_Data/diamonds_sauber.csv")
  1. 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.)
# Deskriptive Statistiken
mean(diamonds$karat)
[1] 0.742
mean(diamonds$preis)
[1] 3543
table(diamonds$cut)

     Fair      Good     Ideal   Premium Very Good 
        2         5        46        31        16 
table(diamonds$klarheit)

  I1   IF  SI1  SI2  VS1  VS2 VVS1 VVS2 
   1    4   17   19   15   24   10   10 

E - Logische Vektoren

  1. Logische Vektoren enthalten nur die Werte 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
# Kreiere Vektor teuer
teuer <- diamonds$preis > 10000
  1. 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?
# Print teuer
teuer
  [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [25]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
 [49] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [85] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [97] FALSE FALSE FALSE FALSE
  1. Erweitere den Datensatz um die neue Variable teuer.
# Ergänze Vektor
XX$YY <- ZZ
# Ergänze Vektor
diamonds$teuer <- teuer
  1. Verwende die Funktion table(), um auszuzählen wie viele Diamanten teuer sind. Benutze hierzu wiederum den $-Operator um die Variable auszuwählen.
# Zähle die teuren Diamanten
table(diamonds$teuer)

FALSE  TRUE 
   92     8 
  1. Verwende die mean() Funktion, um auszuzählen welcher Anteil teuer ist. Erinnere, mean() funktioniert auch mit logischen Vektoren.
# Anteil teuerer Diamanten
mean(diamonds$teuer)
[1] 0.08
  1. Verwende sowohl einen logischen Vergleich, > oder <, als auch die mean() Funktion, um zu bestimmen welcher Anteil Diamanten mehr als 1 Karat besitzt.
# Anteil Diamanten mit karat > 1
mean(diamonds$karat > 1)
[1] 0.26

F - Einlesen Anderer Formate

Excel

In diesem Abschnitt liest du den ebenfalls sehr bekannten titanic Datensatz aus einem Excel Format und speicherst die Daten als .csv.

  1. Verwende die read_excel() Funktion, um den Datensatz titanic.xls als ein neues Objekt titanic einzulesen.
# Lese titanic.xls
titanic <- read_excel(path = "XX")
# Lese titanic.xls
titanic <- read_excel("1_Data/titanic.xls")
  1. Printe titanic und evaluiere die Ausmasse des Datensatzes mit dim().
# Printe und evaluiere Ausmasse
titanic
# A tibble: 1,309 x 14
   pclass survived name  sex      age sibsp parch ticket  fare cabin embarked
    <dbl>    <dbl> <chr> <chr>  <dbl> <dbl> <dbl> <chr>  <dbl> <chr> <chr>   
 1      1        1 Alle… fema… 29         0     0 24160  211.  B5    S       
 2      1        1 Alli… male   0.917     1     2 113781 152.  C22 … S       
 3      1        0 Alli… fema…  2         1     2 113781 152.  C22 … S       
 4      1        0 Alli… male  30         1     2 113781 152.  C22 … S       
 5      1        0 Alli… fema… 25         1     2 113781 152.  C22 … S       
 6      1        1 Ande… male  48         0     0 19952   26.6 E12   S       
 7      1        1 Andr… fema… 63         1     0 13502   78.0 D7    S       
 8      1        0 Andr… male  39         0     0 112050   0   A36   S       
 9      1        1 Appl… fema… 53         2     0 11769   51.5 C101  S       
10      1        0 Arta… male  71         0     0 PC 17…  49.5 <NA>  C       
# … with 1,299 more rows, and 3 more variables: boat <chr>, body <dbl>,
#   home.dest <chr>
dim(titanic)
[1] 1309   14
  1. Verwende table() um auszuzählen wie viele Leute das Unglück der Titanic überlebt haben (Variable survived).
# Wie viele haben überlebt?
table(titanic$XX)
# Wie viele haben überlebt?
table(titanic$XX)
< table of extent 0 >
  1. Verwende nochmals 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)
# Wie viele haben pro Passagierklasse überlebt?
table(titanic$pclass, titanic$survived)
   
      0   1
  1 123 200
  2 158 119
  3 528 181
  1. Verwende write_csv(), um den Datensatz titanic als .csv auf in deinen 1_Data Ordner zu schreiben.
# Schreiben Daten als .csv
write_csv(x = titanic, 
          path = "1_Data/titanic.csv")

SPSS

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.

  1. Verwende die read_spss() Funktion, um den Datensatz sleep.sav als ein neues Objekt sleep einzulesen.
XX <- read_spss(file = "XX")
# Lese sleep Daten
sleep <- read_spss(file = "1_Data/sleep.sav")
  1. Printe sleep und evaluiere die Ausmasse des Datensatzes mit dim(). Du wirst sehen, R war so clever die Labels der Variablen mit zu übernehmen.
# Printe und evaluiere Ausmass
sleep
# A tibble: 271 x 55
      id     sex   age marital edlevel weight height healthrate fitrate
   <dbl> <dbl+l> <dbl> <dbl+l> <dbl+l>  <dbl>  <dbl>  <dbl+lbl> <dbl+l>
 1    83 0 [fem…    42 2 [mar… 2 [sec…     52    162 10 [very …       7
 2   294 0 [fem…    54 2 [mar… 5 [pos…     65    174  8               7
 3   425 1 [mal…    NA 2 [mar… 2 [sec…     89    170  6               5
 4    64 0 [fem…    41 2 [mar… 5 [pos…     66    178  9               7
 5   536 0 [fem…    39 2 [mar… 5 [pos…     62    160  9               5
 6    57 0 [fem…    66 2 [mar… 4 [und…     62    165  8               8
 7   251 0 [fem…    36 1 [sin… 3 [tra…     62    165  9               7
 8   255 0 [fem…    35 2 [mar… 5 [pos…     75    174  6               6
 9   265 1 [mal…    NA 2 [mar… 5 [pos…     90    180  6               6
10   290 1 [mal…    41 2 [mar… 5 [pos…     75    187  9               9
# … with 261 more rows, and 46 more variables: weightrate <dbl+lbl>,
#   smoke <dbl+lbl>, smokenum <dbl>, alchohol <dbl>, caffeine <dbl>,
#   hourwnit <dbl>, hourwend <dbl>, hourneed <dbl>, trubslep <dbl+lbl>,
#   trubstay <dbl+lbl>, wakenite <dbl+lbl>, niteshft <dbl+lbl>,
#   liteslp <dbl+lbl>, refreshd <dbl+lbl>, satsleep <dbl+lbl>,
#   qualslp <dbl+lbl>, stressmo <dbl+lbl>, medhelp <dbl+lbl>,
#   problem <dbl+lbl>, impact1 <dbl+lbl>, impact2 <dbl+lbl>, impact3 <dbl+lbl>,
#   impact4 <dbl+lbl>, impact5 <dbl+lbl>, impact6 <dbl+lbl>, impact7 <dbl+lbl>,
#   stopb <dbl+lbl>, restlss <dbl+lbl>, drvsleep <dbl+lbl>, drvresul <dbl+lbl>,
#   ess <dbl>, anxiety <dbl>, depress <dbl>, fatigue <dbl>, lethargy <dbl>,
#   tired <dbl>, sleepy <dbl>, energy <dbl>, stayslprec <dbl+lbl>,
#   getsleprec <dbl+lbl>, qualsleeprec <dbl+lbl>, totsas <dbl>,
#   cigsgp3 <dbl+lbl>, agegp3 <dbl+lbl>, probsleeprec <dbl+lbl>,
#   drvslprec <dbl+lbl>
dim(sleep)
[1] 271  55
  1. 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!
# Berechne die mittlere Anzahl drinks
mean(x = sleep$alchohol, na.rm = TRUE)
[1] 1
  1. Verwende write_csv() um den Datensatz sleep als .csv auf in deinen 1_Data Ordner zu schreiben.
# Schreibe Daten als .csv
write_csv(x = sleep, 
          path = "1_Data/sleep.csv")

X - Mit logicals rechnen

  1. Verwende sum() und > um auszuzählen wie viele Uni Melbourne Mitarbeiter mehr als 10 Drinks pro Tag zu sich nehmen.
# Mehr als 10 Drinks
sum(sleep$alchohol > 10, na.rm = TRUE)
[1] 1
  1. Indentifiziere den Index der Person in der Variable alchohol mit which().
# Index von alchohol > 10
which(sleep$alchohol > 10)
  1. Nutze den Index der Person, um dir deren Geschlecht (sex) und Beziehungsstatus (marital) anzeigen zu lassen. Nutze hier die Klammern [].
# Geschlecht und Alter der Person
sleep$marital[which(sleep$alchohol > 10)]
<labelled<double>[1]>: marital status
[1] 2

Labels:
 value           label
     1          single
     2 married/defacto
     3        divorced
     4         widowed
sleep$sex[which(sleep$alchohol > 10)]
<labelled<double>[1]>: sex
[1] 1

Labels:
 value  label
     0 female
     1   male
  1. Verwende mean() und > um das mittlere Alter derjenigen Personen zu berechnen, die mehr als einen Drink pro Tag zu sich nehmen.
# Mittleres Alter für > 1 Drink
mean(sleep$age[which(sleep$alchohol > 1)], na.rm = TRUE)
[1] 48
  1. Verwende nun den Code der letzten Aufgabe und ! um das mittlere Alter derjenigen Personen zu berechnen, die nicht mehr als einen Drink pro Tag zu sich nehmen. Wo gehört das ! hin?
# Mittleres Alter für not > 1 Drink
mean(sleep$age[which(!sleep$alchohol > 1)], na.rm = TRUE)
[1] 42.5

Beispiele

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")

Datensätze

library(tidyverse)
library(readxl)
library(haven)
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.

Funktionen

Pakete

Paket Installation
tidyverse install.packages("tidyverse")
haven install.packages("haven")
readxl install.packages("readxl")

Funktionen

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

Resourcen

  • Für eine formale Einführung zu den Grundlagen schaut euch introduction to R an.
  • Für alles zu tibbles, Daten Lesen und Schreiben schaut euch Grolemund`s und Wickham’s R for Data Science an.