Prepro 1: Demo

Veröffentlichungsdatum

10. Oktober 2023

Diese Demo kann auch als R Script heruntergeladen werden (Rechtsklick → Save Target As..)

Datentypen

Numerics

Unter die Kategorie numeric fallen in R zwei Datentypen:

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

Folgendermassen wird eine Gleitkommazahl einer Variabel zuweisen:

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 doublean:

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

c <- 8L
is.numeric(c)
## [1] TRUE
is.integer(c)
## [1] TRUE
typeof(a)
## [1] "integer"

is.numeric(a)
## [1] TRUE
is.integer(a)
## [1] TRUE

Logische Abfragen

Wird auch auch als boolesch (Eng. boolean) bezeichnet.

e <- 3
f <- 6

e > f
## [1] FALSE


sonnig <- TRUE
trocken <- FALSE

sonnig & !trocken
## [1] TRUE

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("Donnerstag", "Freitag", "Samstag")

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

wochentage_fac <- as.factor(wochentage)

wochentage
## [1] "Donnerstag" "Freitag"    "Samstag"
wochentage_fac
## [1] Donnerstag Freitag    Samstag   
## Levels: Donnerstag Freitag Samstag

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

Zudem ist fällt auf, dass die Reihenfolge der Wohentag alphabetisch sortiert ist. Eine Ordnung kann man mit dem Befehl ordered = T festlegen, dabei muss die Reihenfolge der Werte im Argument levels = explizit festgehalten werden1.

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

Beachtet 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 das die Zeichenkette in dem obigen Format (Jahr-Monat-Tag Stunde:Minute:Sekunde) daher kommt, braucht as.POSIXctkeine weiteren Informationen.

Sollte das Format von dem 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")

Beachtet, dass in den den 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"

Einfacher sind an dieser Stelle aber die Functions aus lubridate:

library("lubridate")

month(datum2) # extrahiert den Monat als Zahl
## [1] 10
month(datum2, label = TRUE, abbr = TRUE) # extrahiert den Monat mit Namen (abgekürzt)
## [1] Okt
## 12 Levels: Jan < Feb < Mär < Apr < Mai < Jun < Jul < Aug < Sep < ... < Dez
month(datum2, label = TRUE, abbr = FALSE) # extrahiert den Monat mit Namen (ausgeschrieben)
## [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 Variabel zugewiesen werden (als vector).

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

vec2 <- vec[2:4]

Lists

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


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

Die einzelnen Elemente 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 Conveniance Variabeln

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. Dies ist zwar nicht tragisch, aber da wir wissen das es sich hier sicher um Ganzzahlen handelt, können wir das korrigieren. Wichtiger ist aber, dass wir die Ankunftszeit (SpalteAnkunft) 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 Ankunftabgeleitet 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 <- "keine Angabe"

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"

  1. ordered = T kann nur bei der Funktion factor() spezifiziert werden, nicht bei as.factor(). Ansonsten sind factor() und as.factor() sehr ähnlich.↩︎