<- 10.3
x
x## [1] 10.3
typeof(x)
## [1] "double"
Prepro 1: Demo
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:
Statt <-
kann auch =
verwendet werden. Dies funktioniert aber nicht in allen Situationen, und ist zudem leicht mit ==
zu verwechseln.
= 7.3
y
y## [1] 7.3
Ohne explizite Zuweisung nimmt R immer den Datentyp double
an:
<- 42
z 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.
<- as.integer(z)
a is.numeric(a)
## [1] TRUE
is.integer(a)
## [1] TRUE
<- 8L
c 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.
<- 3
e <- 6
f
> f
e ## [1] FALSE
<- TRUE
sonnig <- FALSE
trocken
& !trocken
sonnig ## [1] TRUE
Zeichenketten
Zeichenketten (Eng. character) stellen Text dar
<- as.character(3.14)
s
s## [1] "3.14"
typeof(s)
## [1] "character"
Zeichenketten verbinden / zusammenfügen (Eng. concatenate)
<- "Andrea"
fname <- "Muster"
lname paste(fname, lname)
## [1] "Andrea Muster"
<- "Simon"
fname2 == fname2
fname ## [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”).
<- c("Donnerstag", "Freitag", "Samstag")
wochentage
typeof(wochentage)
## [1] "character"
<- as.factor(wochentage)
wochentage_fac
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).
<- "2017-10-01 13:45:10"
datum
# 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.POSIXct
keine 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.
<- "01.10.2017 13:45"
datum
# konvertiert character in POSIXct:
as.POSIXct(datum, format = "%d.%m.%Y %H:%M")
## [1] "2017-10-01 13:45:00 CEST"
<- as.POSIXct(datum, format = "%d.%m.%Y %H:%M") datum2
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
).
<- c(10, 20, 33, 42, 54, 66, 77)
vec
vec## [1] 10 20 33 42 54 66 77
5]
vec[## [1] 54
2:4]
vec[## [1] 20 33 42
<- vec[2:4] vec2
Lists
Eine list
ist eine Sammlung von Objekten, die nicht unbedingt vom gleichen Datentyp sein müssen.
<- list("q", TRUE, 3.14) mylist
Die einzelnen Elemente einer Liste können auch Namen zugewiesen werden.
<- list(fav_letter = "q", fav_boolean = TRUE, fav_number = 3.14)
mylist2
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.
<- data.frame(
df 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:
$Stadt
df## [1] "Zürich" "Genf" "Basel" "Bern" "Lausanne"
So können auch neue Spalten hinzugefügt oder bestehende verändert werden:
$Einwohner <- c(400000, 200000, 175000, 14000, 130000)
df
$Einwohner <- as.integer(df$Einwohner) df
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.
$Ankunft <- as.POSIXct(df$Ankunft, format = "%d.%m.%Y %H:%M")
df
$Ankunft
df## [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.
$Ankunft_stunde <- hour(df$Ankunft)
df
$Ankunft_stunde
df## [1] 10 14 13 18 21
Oder aber, wir teilen die Städte in gross, mittel und klein ein.
$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
df## [1] "gross" "mittel" "mittel" "klein" "klein"
ordered = T
kann nur bei der Funktionfactor()
spezifiziert werden, nicht beias.factor()
. Ansonsten sindfactor()
undas.factor()
sehr ähnlich.↩︎