<- 10.3
x
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
: Fliesskommazahl (z.B. 10.3, 7.3)integer
: Ganzzahl (z.B. 10, 7)
Doubles
Folgendermassen wird eine Fliesskommazahl einer Variable zugewiesen:
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
# Das L steht für Long Integer
<- 8L
c is.integer(c)
## [1] TRUE
Logische Abfragen
Wird auch als boolesch (Eng. boolean) bezeichnet.
3 > 6
## [1] FALSE
<- TRUE
sonnig <- FALSE
trocken
# ist es sonnig und trocken?
& trocken
sonnig ## [1] FALSE
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("Montag", "Dienstag", "Mittwoch")
wochentage
typeof(wochentage)
## [1] "character"
<- as.factor(wochentage)
wochentage_fac
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).
<- "2017-10-01 13:45:10"
datum
# 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.
<- "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
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
).
<- c(10, 20, 33, 42, 54, 66, 77)
vec
vec## [1] 10 20 33 42 54 66 77
# Mit eckigen Klammern können einzelne oder mehrere Werte extrahiert werden
5]
vec[## [1] 54
2:4]
vec[## [1] 20 33 42
Lists
Eine list
ist eine Sammlung von Objekten, die nicht vom gleichen Datentyp sein müssen.
<- list("q", TRUE, 3.14) mylist
Den einzelnen Elementen 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 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.
<- 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. 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.
$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[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"