Text und Data Frames

von Karl-Kuno Kunze

In diesem Artikel untersuchen wir eine übliche Empfehlung beim Umgang mit Data Frames.

Das Hinzufügen von Datensätzen zu data frames kann schwierig sein

Erzeugen wir einen kleinen Data Frame mit zwei Städten und ihren Einwohnern (in Mio.)

myDF <- data.frame(City = c("Berlin","London"), 
              Inhabitants  = c(3.375, 8.308)); myDF
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308

Jetzt versuchen wir mit rbind(), einen weiteren Datensatz hinzuzufügen:

myDF <- rbind(myDF, 
              c(City = "Paris", 
         Inhabitants = 2.244)); myDF
## Warning in `[<-.factor`(`*tmp*`, ri, value = "Paris"): invalid factor
## level, NA generated
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308
## 3   <NA>       2.244

Hier kommt eine Standardeinstellung von R ans Licht. Textvariablen werden in Faktoren umgewandelt, befor sie an den Data Frame weitergereicht werden. Einer Faktorvariable einfach einen Text zuzuweisen, ist dann nicht mehr möglich. Ein Faktor ist eine kategoriale Variable, die verschiedene Werte annehmen kann, zum Beispiel die Augenfarbe.

Übliche Empfehlung:

Häufig hört man in solch einem Fall die Empfehlung, die Option stringsAsFactors = FALSE einzustellen, wenn man den Data Frame erzeugt. Das sehen Sie hier:

myDF <- data.frame(City = c("Berlin","London"), 
              Inhabitants  = c(3.375, 8.308),
              stringsAsFactors = FALSE); myDF
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308

Jetzt konvertiert R die Texte nicht in Faktoren.

Wenn wir nun versuchen, mit rbind() einen weiteren Datensatz anzuhängen, gibt es keine Probleme:

myDF <- rbind(myDF, 
              c(City = "Paris", 
         Inhabitants = 2.244)); myDF
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308
## 3  Paris       2.244

Alles läuft wie gewünscht.

str(myDF$City)
##  chr [1:3] "Berlin" "London" "Paris"

Eine andere Möglichkeit

Was wir weiter oben gesehen haben, ist sicher korrekt und klappt prima. Jedoch beraubt es uns einer Struktur, die möglicherweise in den Daten liegt. Darüber hinaus gibt es in R ein paar nette Funktionen, die Faktoren als Argumenten vorbehalten sind. Daher versuchen wir es jetzt erneut, diesmal wieder ohne die Option stringsAsFactors = FALSE.

myDF <- data.frame(City = c("Berlin","London"), 
              Inhabitants  = c(3.375, 8.308)); myDF
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308

Wenn wir jetzt den Code für das Hinzufügen der Zeile wie folgt ändern, also c durch data.frame ersetzen, klappt das Hinzufügen auch und wir erhalten die Struktur eines Faktors für die Variable ‚City‘:

myDF <- rbind(myDF, 
              data.frame(City = "Paris", 
                  Inhabitants = 2.244)); myDF
##     City Inhabitants
## 1 Berlin       3.375
## 2 London       8.308
## 3  Paris       2.244
str(myDF$City)
##  Factor w/ 3 levels "Berlin","London",..: 1 2 3

________________________________________________________________________________________________

Sie sind an weiteren Tipps über die Programmiersprache R interessiert? Tragen Sie sich in unseren Newsletter ein und bleiben Sie auf dem Laufenden.

Interesse an einem Seminar beim Autor Karl-Kuno Kunze? Hier gelangen Sie zu unseren Trainings in Potsdam. Optional auch in Ihrem Unternehmen vor Ort. Sprechen Sie uns an!