Prepro 1: Demo

Diese Demo kann hier heruntergeladen werden (Rechtsklick → speichern unter).

Datentypen

Numerics

Unter die Kategorie numeric fallen in R zwei Datentypen:

  • double: Fliesskommazahl (z.B. 10.3, 7.3)
  • integer: Ganzzahl (z.B. 10, 7)
Doubles

Folgendermassen wird eine Fliesskommazahl einer Variable zugewiesen:

x <- 10.3

x
## [1] 10.3

typeof(x)
## [1] "double"

Statt <- kann auch = verwendet werden. Dies funktioniert aber nicht in allen Situationen, und ist zudem leicht mit == zu verwechseln.

y = 7.3
y
## [1] 7.3

Ohne explizite Zuweisung nimmt R immer den Datentyp double an:

z <- 42
typeof(z)
## [1] "double"
is.integer(z)
## [1] FALSE
is.numeric(z)
## [1] TRUE
is.double(z)
## [1] TRUE

Ganzzahl / Integer

Erst wenn man eine Zahl explizit als integer definiert (mit as.integer() oder L), wird sie auch als solches abgespeichert.

a <- as.integer(z)
is.numeric(a)
## [1] TRUE
is.integer(a)
## [1] TRUE

# Das L steht für Long Integer
c <- 8L
is.integer(c)
## [1] TRUE

Logische Abfragen

Wird auch als boolesch (Eng. boolean) bezeichnet.

3 > 6
## [1] FALSE


sonnig <- TRUE
trocken <- FALSE

# ist es sonnig und trocken?
sonnig & trocken
## [1] FALSE

Zeichenketten

Zeichenketten (Eng. character) stellen Text dar

s <- as.character(3.14)
s
## [1] "3.14"
typeof(s)
## [1] "character"

Zeichenketten verbinden / zusammenfügen (Eng. concatenate)

fname <- "Andrea"
lname <- "Muster"
paste(fname, lname)
## [1] "Andrea Muster"

fname2 <- "Simon"
fname == fname2
## [1] FALSE

Factors

Mit Factors wird in R eine Sammlung von Zeichenketten bezeichnet, die sich wiederholen, z.B. Wochentage (es gibt nur 7 unterschiedliche Werte für “Wochentage”).

wochentage <- c("Montag", "Dienstag", "Mittwoch")

typeof(wochentage)
## [1] "character"

wochentage_fac <- as.factor(wochentage)

wochentage
## [1] "Montag"   "Dienstag" "Mittwoch"
wochentage_fac
## [1] Montag   Dienstag Mittwoch
## Levels: Dienstag Mittwoch Montag

Wie man oben sieht, unterscheiden sich character vectors und factors v.a. dadurch, dass letztere über sogenannte levels verfügen. Diese levels entsprechen den eindeutigen Werten.

Bei den levels fällt auf, dass die Reihenfolge der Wochentage alphabetisch sortiert ist. Eine Ordnung kann in der Funktion factor (nicht as.factor) mit dem Argument ordered = TRUE festgelegt werden, dabei kann die Reihenfolge der Werte im Argument levels = explizit festgelegt werden. In der Praxis ist dies vor allem bei Visualisierungen von Bedeutung.

factor(wochentage, levels = c("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"), ordered = TRUE)
## [1] Montag   Dienstag Mittwoch
## 7 Levels: Montag < Dienstag < Mittwoch < Donnerstag < Freitag < ... < Sonntag

Beachte das <-Zeichen zwischen den Levels!

Zeit/Datum

Um in R mit Datum/Zeit Datentypen umzugehen, müssen sie als POSIXct eingelesen werden. Anders als beispielsweise bei Excel sollten in R Datum und Uhrzeit immer zusammen gespeichert werden (in einem Objekt oder einem Vektor).

datum <- "2017-10-01 13:45:10"

# konvertiert character in POSIXct:
as.POSIXct(datum)
## [1] "2017-10-01 13:45:10 CEST"

Wenn die Zeichenkette in dem obigen Format (Jahr-Monat-Tag Stunde:Minute:Sekunde) daher kommt, braucht as.POSIXct keine weiteren Informationen.

Sollte das Format davon aber abweichen, muss man der Funktion das genaue Schema jedoch mitteilen. Der Syntax dafür kann via ?strptime nachgeschlagen werden.

datum <- "01.10.2017 13:45"

# konvertiert character in POSIXct:
as.POSIXct(datum, format = "%d.%m.%Y %H:%M")
## [1] "2017-10-01 13:45:00 CEST"

datum2 <- as.POSIXct(datum, format = "%d.%m.%Y %H:%M")

Beachte, dass im obigen Beispiel R automatisch eine Zeitzone angenommen hat, (CEST). R geht davon aus, dass die Zeitzone der System Timezone (Sys.timezone()) entspricht.

Um nun aus dem Datum wieder spezifische Bestandteile zu extrahieren, kann man theoretisch die gleichen Codes nochmal verwenden.

strftime(datum2, format = "%m") # extrahiert den Monat als Zahl
## [1] "10"
strftime(datum2, format = "%b") # extrahiert den Monat mit Namen (abgekürzt)
## [1] "Okt"
strftime(datum2, format = "%B") # extrahiert den Monat mit Namen (ausgeschrieben)
## [1] "Oktober"

Für das Extrahieren empfehlen wir aber die entsprechenden Funktionen aus lubridate:

library("lubridate")

# extrahiert den Monat als Zahl
month(datum2) 
## [1] 10
# extrahiert den Monat mit Namen (abgekürzt)
month(datum2, label = TRUE, abbr = TRUE) 
## [1] Okt
## 12 Levels: Jan < Feb < Mär < Apr < Mai < Jun < Jul < Aug < Sep < ... < Dez
# extrahiert den Monat mit Namen (ausgeschrieben)
month(datum2, label = TRUE, abbr = FALSE) 
## [1] Oktober
## 12 Levels: Januar < Februar < März < April < Mai < Juni < Juli < ... < Dezember

Vectors

Mit c() können eine Reihe von Werten vom gleichen Datentyp einer Variable zugewiesen werden (als vector).

vec <- c(10, 20, 33, 42, 54, 66, 77)
vec
## [1] 10 20 33 42 54 66 77

# Mit eckigen Klammern können einzelne oder mehrere Werte extrahiert werden
vec[5]
## [1] 54
vec[2:4]
## [1] 20 33 42

Lists

Eine list ist eine Sammlung von Objekten, die nicht vom gleichen Datentyp sein müssen.

mylist <- list("q", TRUE, 3.14)

Den einzelnen Elementen einer Liste können auch Namen zugewiesen werden.


mylist2 <- list(fav_letter = "q", fav_boolean = TRUE, fav_number = 3.14)

mylist2
## $fav_letter
## [1] "q"
## 
## $fav_boolean
## [1] TRUE
## 
## $fav_number
## [1] 3.14

Data Frames und Convenience Variablen

Wenn jeder Eintrag einer Liste gleich lang ist, kann diese Liste auch als Tabelle verstanden werden. Idealerweise sind die Elemente benannt, welche dann als Spaltennamen verwendet werden können.

as.data.frame(mylist2)
##   fav_letter fav_boolean fav_number
## 1          q        TRUE       3.14

Mit der Funktion data.frame kann direkt eine Tabelle erstellt werden, ohne zuerst eine Liste zu erstellen.

df <- data.frame(
  Stadt = c("Zürich", "Genf", "Basel", "Bern", "Lausanne"),
  Ankunft = c(
    "1.1.2017 10:00", "1.1.2017 14:00",
    "1.1.2017 13:00", "1.1.2017 18:00", "1.1.2017 21:00"
  )
)

str(df)
## 'data.frame':    5 obs. of  2 variables:
##  $ Stadt  : chr  "Zürich" "Genf" "Basel" "Bern" ...
##  $ Ankunft: chr  "1.1.2017 10:00" "1.1.2017 14:00" "1.1.2017 13:00" "1.1.2017 18:00" ...

Um Daten abzufragen, nutzt man das $ Symbol:

df$Stadt
## [1] "Zürich"   "Genf"     "Basel"    "Bern"     "Lausanne"

So können auch neue Spalten hinzugefügt oder bestehende verändert werden:

df$Einwohner <- c(400000, 200000, 175000, 14000, 130000)

df$Einwohner <- as.integer(df$Einwohner)

In der obigen data.frame wurde die Spalte Einwohner als Fliesskommazahl abgespeichert. Das ist zwar nicht tragisch, aber da wir wissen, dass es sich hier sicher um Ganzzahlen handelt, können wir das korrigieren. Wichtiger ist aber, dass wir die Ankunftszeit (Spalte Ankunft) von einem Factor in ein Zeitformat (POSIXct) umwandeln.


df$Ankunft <- as.POSIXct(df$Ankunft, format = "%d.%m.%Y %H:%M")

df$Ankunft
## [1] "2017-01-01 10:00:00 CET" "2017-01-01 14:00:00 CET"
## [3] "2017-01-01 13:00:00 CET" "2017-01-01 18:00:00 CET"
## [5] "2017-01-01 21:00:00 CET"

Diese Spalten können nun helfen, um Hilfsvariablen (convenience variables) zu erstellen. Z.B. kann die Ankunftszeit von der Spalte Ankunft abgeleitet werden.

df$Ankunft_stunde <- hour(df$Ankunft)

df$Ankunft_stunde
## [1] 10 14 13 18 21

Oder aber, wir teilen die Städte in gross, mittel und klein ein.

df$Groesse[df$Einwohner > 300000] <- "gross"
df$Groesse[df$Einwohner <= 300000 & df$Einwohner > 150000] <- "mittel"
df$Groesse[df$Einwohner <= 150000] <- "klein"

df$Groesse
## [1] "gross"  "mittel" "mittel" "klein"  "klein"