Viele Sprachen haben eine Möglichkeit wie null oder none, um einen nicht existierenden Wert anzuzeigen. Weil R darauf ausgelegt ist, große Mengen (oft unordentlicher) Daten zu verarbeiten, gibt es mehrere Formen von „Nichts“.
Das übergeordnete Ziel ist, fehlende oder verdächtige Werte zu markieren, sobald sie auftauchen, und dann fortzufahren, ohne eine Ausnahme auszulösen.
Wenn ein Wert wirklich nicht existiert, wird er durch NULL dargestellt. Das kommt wohl am ehesten dem nahe, was C oder Python machen würden.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
In vielen Zusammenhängen werden NULL-Werte einfach ignoriert:
c(2, 3, NULL, 5)
#> [1] 2 3 5
Für Situationen, in denen ein Wert existiert, wir aber nicht wissen, welcher, verwendet man NA. Wenn zum Beispiel Fahrzeuge auf einer Straße gezählt werden, können menschliche Beobachter krank werden oder automatische Sensoren ausfallen, aber der Verkehr fließt weiter.
v <- c(1, 2, NA, 4, 5)
v
#> [1] 1 2 NA 4 5
is.na(v) # test for data gaps
#> [1] FALSE FALSE TRUE FALSE FALSE
NA ist also ein Platzhalter, der Menschen warnt, dass sie entscheiden müssen, wie sie damit umgehen.
Statistische Funktionen geben standardmäßig meist NA zurück, wenn NA-Werte vorhanden sind.
Wenn du willst, dass diese Werte ignoriert werden, mach das mit dem Parameter na.rm (NA remove) ausdrücklich:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
NaN ist die Abkürzung für „Not a Number“ und markiert ein Berechnungsproblem in Situationen, in denen eine Zahl erwartet wurde.
n <- c(0, 2, 4)
d <- c(0, 1, 2)
n / d
#> [1] NaN 2 2 # 0/0 is mathematically undefined
is.nan(n / d)
#> [1] TRUE FALSE FALSE
Das ist nicht die einzige Möglichkeit für „ungültige“ Berechnungen.
Eine Division durch null gibt bei einem Zähler ungleich null Inf oder -Inf zurück, ohne einen Fehler auszulösen.
1 / 0
#> [1] Inf
Vielleicht überraschend: R hat keine Standardmethode, um auf Leerheit zu prüfen, obwohl einige Pakete von Drittanbietern eigene Funktionen wie is.empty() mitbringen.
Schon das Erzeugen eines leeren Vektors ist nicht ganz offensichtlich.
In einem früheren Abschnitt haben wir gesehen, dass c() ohne Argumente NULL zurückgibt, keinen Vektor.
is.vector(c())
#> [1] FALSE
Funktionen wie logical() oder integer() nehmen ein Argument, das die gewünschte Länge angibt, und die kann null sein.
z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0
Wir können auch einen Vektor erzeugen und dann jedes Element entfernen, wie im Vektoren-Konzept beschrieben. Das ergibt einen Vektor der Länge 0 mit einem passenden Typ.
v <- 5
v[-1] # delete the first element
#> numeric(0)