3.1 Datentypen

Im folgenden werden die vier grundlegenden Datentypen (atomic vectors) behandelt:

  • logical (TRUE, FALSE)
  • integer (c(1, 2.4, 4.678))
  • double (auch als numeric bezeichnet; c(1L, 2L, 3L))
  • character (c(“these are”, “some strings”))
Atomic vectors, source: https://adv-r.hadley.nz/vectors-chap.html

Figure 3.4: Atomic vectors, source: https://adv-r.hadley.nz/vectors-chap.html

Diese Datentypen können in Form bestimmter Datenstrukturen miteinander verknüft werden. In R ist dies über die Dimensionalität der Daten definiert mit den fünf häufigsten Strukturen:

Datenstrukturen in R
Homogen Heterogen
1d Atomic vector List
2d Matrix Data frame
nd Array

🔍 Advanced R by Hadly Wickham

3.1.1 Numerische Objekte

Zahlenwerte in R werden als numeric bezeichnet mit der Unterteilung in integer (ganze Zahlen) oder double (Dezimalzahlen). Die Zuweisung von R, selbst wenn ich eine ganze Zahl zuweise, ist jedoch vom Typ double.

a <- 4
typeof(a)
## [1] "double"

💡 Mit der Funktion typeof() kann der Objekttyp erfragt werden.

Um eine ganze Zahl wiederzugeben muss ein L hinter die Zahl gesetzt werden.

a <- 4L
typeof(a)
## [1] "integer"

3.1.2 Textobjekte

Ein character Objekt sind Namen wie "Kristof", "Tim", "Beste Norddeutschland Exkursion der Welt" (Textvariablen werden auch als string bezeichnet). Um ein character Objekt zu definieren sind die Anführungsstriche als einfache ' ' oder doppelte " " Anführungszeichen wichtig!

# Dies sind alles character Objekte 
"Kristof"
## [1] "Kristof"
"Tim"
## [1] "Tim"
"Beste Norddeutschland Exkursion der Welt"
## [1] "Beste Norddeutschland Exkursion der Welt"

Bestimmte Funktionen brauchen einen numerical input, wohingegen andere einen character input benötigen. Schaue was passiert:

mean(c("5", "1"))

Warnmeldung:In mean.default(c(“5”, “1”)) :Argument ist weder numerisch noch boolesch: gebe NA zurück

Lasse ich die Anführungsstriche weg, dann ist wieder alles im Lot:

mean(c(5, 1))
## [1] 3

3.1.3 Logicals

Der dritte wichtige Objekttyp in R lautet logical und dieser kann zwei Werte annehmen: TRUE (wahr) und FALSE (falsch). Logicals entstehen durch den logischen Vergleich zwischen zwei Werten oder den Elementen eines Vektors. Operatoren die für diese Anfrage genutzt werden können lauten:

Logische Operatoren in R.
Operator Bedeutung Beispiel
== ist gleich 1==1 (ergibt TRUE) “a”==“b” (ergibt FALSE)
!= ist nicht gleich 1 != 1 (ergibt FALSE) “a” != “b” (ergibt TRUE)
< ist kleiner als 1 < 2 (ergibt TRUE) 2 < 2 (ergibt FALSE)
> ist größer als 2 > 1 (ergibt TRUE) 2 > 2 (ergibt FALSE)
<= ist kleiner gleich 1 <= 2 (ergibt TRUE) 2 <= 2 (ergibt TRUE)
>= ist größer gleich 2 >= 1 (ergibt TRUE) 2 >= 2 (ergibt TRUE)

3.1.4 Fehlende Werte

In R werden fehlende Werte mit NA für not available gekennzeichnet. Für bestimmte Funktionen und Anwendungen ist es wichtig, falls ein NA Wert in einer Zeitreihe auftritt (🤯 …leider ist dies in langen Zeitreihen fast immer der Fall), R explizit zu sagen was mit diesen Werten getan werden soll.

# Ich habe einen Vektor mit einem fehlenden Wert NA
a <- c(1,2,3,4,NA,5)
mean(a)
## [1] NA

Hm…der Mittelwert von 1,2,3,4,NA und 5 ist NA und nicht eine Zahl? Wie kommt das bloß. In dem Fall ist es nützlich in die Dokumentation der Funktion mean() nachzuschauen.

?mean

Default S3 method: mean(x, trim = 0, na.rm = FALSE, …)

Die default Argumente der Funktion lauten na.rm = FALSE, was soviel bedeutet na Werte nicht zu entfernen sondern in die Berechnung mit einzubeziehen.

💡 na steht für fehlende Werte (NA) und rm ist die Kurzform für remove, also entfernen.

Damit unsere Rechnung funktioniert müssen wir in der mean() Funktion das Argument na.rm = TRUE setzen, also erst die fehlende Werte entfernen und dann den Mittelwert berechnen:

mean(a, na.rm = TRUE)
## [1] 3

💪 Es funktioniert! Dies ist tatsächlich einer der häufigsten Fehler und egal wie häufig man daran denkt, es kommt immer wieder vor das dies einer der Gründe ist warum man sich Stunden den Kopf über ein nicht funktionierendes Skript zerbricht 🤯

3.1.5 Weitere Objekttypen

Neben den drei vermeintlich wichtigsten Objekttypen (numeric, character, logical) gibt es in R noch die Typen für

  • Kategoriale Variablen factor
  • Datumsangaben date
  • Datumsangaben + Zeit datetime
  • … und weitere

Wenn man Daten in R einliest muss man R jedoch einen Schubser geben, damit eine Spalte bspw. auch als dateerkannt wird und nicht als character oder numeric. Wie man dies berücksichtigt lernen wir in dem Kapitel Daten einlesen.

3.1.5.1 S3 Objekte

Vektoren in R weisen verschiedene Attribute auf. Die zwei wichtigsten Attribute sind:

  • dimension (wandelt einen Vektor in eine Matrix oder Liste um)
  • class (bedient S3 Objekte, bspw. factor, date und POSIXct)

Wenn ein Objekt in R ein class Attribut besitzt wird es automatisch in ein S3 object umgewandelt und unterscheidet sich dadurch von einem normalen Vektor.

S3 atomic vectors, source: https://adv-r.hadley.nz/vectors-chap.html

Figure 3.5: S3 atomic vectors, source: https://adv-r.hadley.nz/vectors-chap.html

factor sind bspw. aufgebaut aus den Attributen class und levels um kategorische Daten zu speichern.

3.1.6 Objekttypen ändern

Die Syntax in R um Objekte umzuwandeln lautet as.[Objekttyp].

a <- "25"
typeof(a)
## [1] "character"
a <- as.numeric(a)
typeof(a)
## [1] "double"

Dies klappt allerdings nur, insofern die Umwandlung logisch ist. In allen anderen Fällen gibt es eine Warnmeldung unter Erzeugung von NAs anstelle der Werte.

a <- as.numeric("Beste Norddeutschland Exkursion der Welt")

## Warning: NAs introduced by coercion