x <- 10.3
x
## [1] 10.3
typeof(x)
## [1] "double"Prepro 1: Demo
Diese Demo kann hier heruntergeladen werden (Rechtsklick → speichern unter).
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:
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.3Ohne 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] TRUEGanzzahl / 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] TRUEtypeof(a)
## [1] "integer"
is.numeric(a)
## [1] TRUE
is.integer(a)
## [1] TRUELogische Abfragen
Wird auch auch als boolesch (Eng. boolean) bezeichnet.
e <- 3
f <- 6
e > f
## [1] FALSE
sonnig <- TRUE
trocken <- FALSE
sonnig & !trocken
## [1] TRUEZeichenketten
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] FALSEFactors
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 MontagWie 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 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] Montag Dienstag Mittwoch
## 7 Levels: Montag < Dienstag < Mittwoch < Donnerstag < Freitag < ... < SonntagBeachtet 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")Beachtet, 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] "Oct"
strftime(datum2, format = "%B") # extrahiert den Monat mit Namen (ausgeschrieben)
## [1] "October"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] Oct
## 12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
month(datum2, label = TRUE, abbr = FALSE) # extrahiert den Monat mit Namen (ausgeschrieben)
## [1] October
## 12 Levels: January < February < March < April < May < June < ... < DecemberVectors
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)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.14Data 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.14Mit 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, 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 21Oder 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"ordered = Tkann nur bei der Funktionfactor()spezifiziert werden, nicht beias.factor(). Ansonsten sindfactor()undas.factor()sehr ähnlich.↩︎