Faktor in R: Kategoriale Variable und kontinuierliche Variablen

⚡ Intelligente Zusammenfassung

Factor in R speichert kategoriale Daten als Vektor von ganzzahligen Codes, die mit einer Menge von Stufen gepaart sind. Dadurch trennt die Sprache eine begrenzte Gruppe von Kategorien von einer kontinuierlichen Messung.

  • 🏷️ Struktur: Ein Faktor enthält ganzzahlige Codes sowie ein Level-Attribut, sodass jede Kategorie anhand einer festen Liste validiert wird.
  • 🧩 Schaffung: factor() wandelt einen Zeichenvektor um, und class() bestätigt, dass das Ergebnis von Zeichen zu Faktor geändert wurde.
  • 🔘 Nennwert: Ohne ein Level-Argument sortiert R die Kategorien selbst, sodass keine Rangfolge zwischen Farben oder Geschlechtern impliziert wird.
  • 📊 Ordinal: Durch die Übergabe von ordered = TRUE mit einem expliziten Levels-Vektor wird die Rangfolge von niedrig nach hoch festgelegt.
  • 🔢 Kontinuierlich: Numerische und ganzzahlige Spalten bleiben standardmäßig zusammenhängend, wie class(mtcars$mpg) zeigt.
  • ⚠️ Konversionsfalle: as.numeric() gibt bei einem Faktor die Levelcodes zurück, daher sollte man zuerst die Bezeichnung über levels() lesen.
  • 🧠 Wartung: relevel() setzt die Modellbasislinie und droplevels() löscht die von einer Teilmenge verbliebenen Kategorien.

Faktor in R Kategoriale Variable und stetige Variablen

Was ist der Faktor in R?

Berücksichtigen Sie R Ein Faktor ist eine Variable, die zur Kategorisierung und Speicherung von Daten dient und eine begrenzte Anzahl an Ausprägungen annehmen kann. Er speichert die Daten als Vektor von Ganzzahlen. In R wird ein Faktor auch als kategoriale Variable bezeichnet, die sowohl Zeichenketten als auch Ganzzahlen als Ausprägungen speichert. Faktoren werden hauptsächlich in der statistischen Modellierung und explorativen Datenanalyse mit R verwendet.

Intern besteht ein Faktor aus zwei gemeinsam übertragenen Objekten: einem ganzzahligen Vektor von Codes und einem Zeichenattribut namens LevelJeder Code entspricht einer Position im Vektor der Ebenen, weshalb die Ausgabe eines Faktors Wörter anzeigt, während unclass() zeigt Zahlen an.

In einem Datensatz können wir zwei Arten von Variablen unterscheiden: kategorisch und kontinuierlich.

  • In der deskriptiven Statistik für kategoriale Variablen in R ist der Wert begrenzt und basiert normalerweise auf einer bestimmten endlichen Gruppe. Eine kategoriale Variable in R kann beispielsweise Länder, Jahr, Geschlecht, Beruf sein.
  • Eine stetige Variable kann hingegen beliebige Werte annehmen, von ganzen Zahlen bis hin zu Dezimalzahlen. Beispiele hierfür sind der Umsatz, der Aktienkurs usw.

Diese Unterscheidung ist wichtig, da R standardmäßig unterschiedliche Werte für jeden Datentyp wählt. Eine numerische Spalte wird mit Mittelwert und Median zusammengefasst, während ein Faktor mit Häufigkeiten pro Ausprägung dargestellt wird. Die Speicherung einer Kategorie als Text oder als Zahl beeinflusst daher die Analyseergebnisse. Die weiteren Speichermodi werden im Leitfaden zu R erläutert. R-Datentypen und Operatoren.

Kategorische Variablen

Kategoriale Variablen in R werden in einem Faktor gespeichert. Sehen wir uns den folgenden Code an, um eine Zeichenkettenvariable in R in eine Faktorvariable umzuwandeln. Viele Modellierungs- und Machine-Learning-Routinen können keinen Rohdatentext verarbeiten, daher müssen die Kategorien vor dem Anpassen des Modells als Stufen oder Zahlen kodiert werden.

Syntax

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

Die R-Basisreferenzdokumente enthalten zwei weitere Argumente, die in der obigen Kurzform ausgelassen werden: ausschließen, wodurch Werte entfernt werden, bevor das Levelset erstellt wird, und nmax, eine obere Schranke für die Anzahl der Ebenen, die die Konvertierung sehr großer Vektoren beschleunigt.

Argumente:

  • x: Ein Vektor von kategorialen Daten in R. Muss eine Zeichenkette oder eine ganze Zahl sein, keine Dezimalzahl.
  • LevelEin Vektor mit möglichen Werten für x. Dieses Argument ist optional. Der Standardwert ist die Liste der eindeutigen Elemente des Vektors x, sortiert in aufsteigender Reihenfolge.
  • Etiketten: Fügt den kategorialen Daten x in R eine Bezeichnung hinzu. Zum Beispiel kann 1 die Bezeichnung „männlich“ und 0 die Bezeichnung „weiblich“ erhalten.
  • ausschließenEin Vektor von Werten, die beim Bilden der Niveaumenge verworfen werden. Ausgeschlossene Werte werden im Ergebnis als NA (nicht verfügbar) dargestellt.
  • bestelltEin logischer Indikator, der festlegt, ob die Ebenen in der angegebenen Reihenfolge als geordnet betrachtet werden sollen.
  • nmax: Eine optionale obere Schranke für die Anzahl der Ebenen, nützlich bei langen Vektoren.

Ejemplo:

Wir wandeln einen Zeichenvektor in einen Faktor um und überprüfen die Änderung mit class().

# Create gender vector
gender_vector <- c("Male", "Female", "Female", "Male", "Male")
class(gender_vector)
# Convert gender_vector to a factor
factor_gender_vector <-factor(gender_vector)
class(factor_gender_vector)

Ausgang:

## [1] "character"
## [1] "factor"

Die Klasse wechselte von Zeichenkette zu Faktor, und an den ausgegebenen Werten änderte sich nichts. Es ist wichtig, eine Transformation durchzuführen. Schnur in eine Faktorvariable in R vor einer maschinellen Lernaufgabe, denn das ist der Zeitpunkt, an dem die Kategorien zu einem festen, validierten Satz werden.

Eine kategoriale Variable in R kann unterteilt werden in nominale kategoriale Variable und ordinale kategoriale Variable.

Nominale kategoriale Variable

Eine nominale kategoriale Variable kann mehrere Werte annehmen, die Reihenfolge spielt jedoch keine Rolle. Zum Beispiel: männlich oder weiblich. Nominale kategoriale Variablen in R haben keine Rangfolge.

# Create a color vector
color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow')
# Convert the vector to factor
factor_color <- factor(color_vector)
factor_color

Ausgang:

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

Aus dem Faktor „Farbe“ lässt sich keine Reihenfolge ableiten. Die Stufenliste ist nur deshalb alphabetisch sortiert, weil kein Argument für „Stufen“ angegeben wurde; R hat die eindeutigen Werte daher selbst sortiert. Diese Sortierung orientiert sich am aktiven Gebietsschema und nicht an reinem ASCII. Dies ist ein Grund, die Stufen explizit anzugeben, wenn die Reihenfolge wichtig ist.

Ordinale kategoriale Variable

Ordinale kategoriale Variablen besitzen eine natürliche Ordnung. Die Rangfolge ergibt sich aus der Reihenfolge des Vektors, der an die entsprechende Funktion übergeben wird. Level Das Argument `ordered = TRUE` weist R an, die Sequenz als Rangfolge und nicht als einfache Liste zu behandeln. Die Einstellung `ordered = FALSE` kehrt die Rangfolge nicht um, sondern erzeugt lediglich einen gewöhnlichen, ungeordneten Faktor. Um von der höchsten zur niedrigsten Stufe zu ordnen, muss der Vektor der Stufen selbst umgekehrt werden.

Ejemplo:

Wir können die Zusammenfassung verwenden, um die Werte für jede Faktorvariable in R zu zählen.

# Create Ordinal categorical vector 
day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening')
# Convert `day_vector` to a factor with ordered level
factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight'))
# Print the new variable
factor_day

Ausgang:

## [1] evening   morning   afternoon midday    
midnight  evening

Die Konsole gibt zuerst die Werte und darunter die Rangfolge aus. Der nächste Block beginnt mit der noch auskommentierten Zeile `Levels`, sodass die Rangfolge sichtbar bleibt, während der Aufruf von `summary()` an den vorherigen Code angehängt wird.

## Levels: morning < midday < afternoon < evening < midnight
# Append the line to above code
# Count the number of occurence of each level
summary(factor_day)

Ausgang:

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

R ordnete die Stufen gemäß dem Argument „levels“ von „Morgen“ bis „Mitternacht“. Da der Faktor geordnet ist, funktionieren Vergleichsoperatoren wie < und > auch hier, was beim oben genannten nominalen Farbfaktor nicht der Fall ist.

Kontinuierliche Variablen

Kontinuierliche Klassenvariablen sind in R der Standardwert. Sie werden als numerische Werte oder Ganzzahlen gespeichert. Dies lässt sich am folgenden Datensatz veranschaulichen. Der Datensatz `mtcars` ist vordefiniert und enthält Informationen zu verschiedenen Fahrzeugtypen. Er kann mit dem Befehl `mtcars` importiert werden. Die Klasse der Variable `mpg` (Meilen pro Gallone) wird überprüft. Sie liefert einen numerischen Wert, was auf eine kontinuierliche Variable hinweist.

dataset <- mtcars
class(dataset$mpg)

Ausgang

## [1] "numeric"

Nicht jede numerische Spalte ist wirklich kontinuierlich. Im selben Datensatz enthält die Spalte „cyl“ nur die Werte 4, 6 und 8, und die Spalte „am“ nur die Werte 0 und 1. Beide sind also Kategorien, die zufällig als Zahlen gespeichert sind. Durch die Umwandlung mit `factor()` vor der Modellierung wird verhindert, dass R die Differenz zwischen 4 und 6 Zylindern als Messgröße interpretiert. Der umgekehrte Vorgang, das Aufteilen einer kontinuierlichen Spalte in Bänder, wird mit `cut()` durchgeführt.

Faktorstufen und -bezeichnungen in R

Das Attribut „levels“ ist der Teil eines Faktors, dessen Anpassung die meiste Zeit in Anspruch nehmen wird, da es sowohl die Ausgabe als auch die vom Modell als Basiswert festgelegte Variable steuert. Vier grundlegende R-Hilfsfunktionen decken nahezu alle Anwendungsfälle ab.

Funktion Was sie tut, Typische Verwendung
Ebenen(f) Liest oder ersetzt die Levelnamen Abkürzungen in lesbare Bezeichnungen umbenennen
nlevels(f) Gibt die Anzahl der Ebenen zurück Die Überprüfung einer Kategorie führte nach dem Zusammenführen nicht zu einer Explosion.
relevel(f, ref) Springt eine Ebene nach vorne Auswahl der Basislinie für eine Regression
droplevels(f) Entfernt Ebenen mit null Beobachtungen Aufräumen nach dem Setzen von Teilmengen oder Filtern

Der folgende Block wendet alle vier Faktoren auf die zuvor erstellten Farb- und Geschlechtsfaktoren an.

# Inspect the levels of an existing factor
levels(factor_color)          # the level names, in the order R stored them
nlevels(factor_color)         # how many distinct levels exist

# Rename the levels in place (the new vector must follow the same order)
levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow')

# Attach labels at creation time instead of renaming afterwards
gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male'))

# Make 'male' the reference level that modelling functions compare against
gender_coded <- relevel(gender_coded, ref = 'male')

# Remove levels that survived a subset but no longer occur in the data
subset_color <- droplevels(factor_color[1:3])

Zwei Details sind wichtig. Die Zuweisung an `levels()` benennt anhand der Position um, sodass ein nicht übereinstimmender Vektor stillschweigend die falsche Kategorie neu beschriftet. Und eine Teilmenge behält alle ursprünglichen Ebenen bei, bis `droplevels()` aufgerufen wird, weshalb ein gefiltertes Datenrahmen kann weiterhin leere Balken darstellen. Etiketten Das Argument ist wiederum anders: Es benennt die Ebenen zum Zeitpunkt der Erstellung, und doppelte Bezeichnungen fassen mehrere Eingabewerte zu einer Ebene zusammen.

Wie man in R einen Faktor in eine Zahl oder ein Zeichen umwandelt

Dies ist der häufigste Fehler in der Faktorisierung von R. Da ein Faktor ganzzahlige Codes speichert, gibt der Aufruf von `as.numeric()` diese Codes anstelle der angezeigten Werte zurück. Der Faktor der Jahre 2021 bis 2023 wird als 1, 2 und 3 zurückgegeben.

# A factor whose labels happen to look like numbers
year_factor <- factor(c('2021', '2023', '2022', '2023'))

# WRONG: this returns the internal codes 1, 3, 2, 3 - not the years
as.numeric(year_factor)

# RIGHT: read the label through the levels attribute first
as.numeric(levels(year_factor))[year_factor]

# Equivalent and easier to remember, but slightly slower
as.numeric(as.character(year_factor))

# Back to plain text
as.character(year_factor)

Die R-Basisdokumentation empfiehlt `as.numeric(levels(f))[f]` als korrekten und etwas schnelleren Weg, wobei `as.numeric(as.character(f))` die lesbarere Alternative darstellt. Beide Methoden lesen zuerst die Bezeichnung und konvertieren sie anschließend.

  • Faktor zum Charakter: as.character(f) gibt die Labels als Klartext zurück.
  • Faktor in ganzzahlige Codes: as.integer(f) oder unclass(f), wenn die Codes das sind, was Sie tatsächlich wollen.
  • Charakter zu Faktor: factor(x) oder die schnellere Kurzform as.factor(x).
  • Numerisch zu Faktor: factor(x) für diskrete Codes, cut(x, breaks) für kontinuierliche Werte, die in Bänder unterteilt werden müssen.

Eine Sicherheitsvorkehrung gilt für alle. Wenn ein Wert in x nicht im Vektor „levels“ vorkommt, setzt factor() dieses Element auf NA, anstatt einen Fehler auszulösen. So können versehentlich Leerzeichen oder Unterschiede in der Groß- und Kleinschreibung Zeilen löschen. Der Vergleich eindeutiger Werte vor und nach der Konvertierung oder Sortieren des Datenrahmens in der neuen Spalte wird das Problem schnell sichtbar.

Faktor vs. Zeichenkette vs. Zahl in R: Wann verwendet man welchen Datentyp?

Die frühzeitige Wahl des Speichermodus spart später viel Zeit beim Debuggen. Die Tabelle vergleicht die drei Modi, die eine Spalte mit Text oder Code annehmen kann.

Eigenschaft Faktor Charakter Numerisch
Gespeichert als Ganzzahlcodes plus ein Ebenenattribut Streicher Doubles oder ganze Zahlen
Fester Wertesatz Ja, definiert durch Ebenen Nein Nein
Sonderanfertigung Display-Bestellung Ja, durch verschiedene Ebenen Nur alphabetisch Nur numerisch
Arithmetik Nicht erlaubt Nicht erlaubt Erlaubt
Modellkontraste Automatisch erstellt zuerst gezwungen Wird als Messgröße behandelt

Verwenden Faktor Wenn die Werte aus einer bekannten, abgeschlossenen Liste stammen, wenn die Anzeige- oder Rangfolge wichtig ist oder wenn die Spalte ein Modell oder eine Diagrammlegende speist. Charakter für Freitext, Kennungen und alles, was Sie analysieren oder verknüpfen möchten, wie z. B. Namen, Notizen und Codes, die ständig mit neuen Werten eintreffen. Verwenden Sie numerisch nur dann, wenn der Abstand zwischen zwei Werten sinnvoll ist.

Im folgenden Abschnitt werden die schnellsten Möglichkeiten aufgezeigt, um zu überprüfen, was Sie tatsächlich besitzen.

# Ask R what each column of a data frame actually is
sapply(mtcars, class)

# Direct membership tests
is.factor(factor_day)
is.ordered(factor_day)

# unclass() exposes the integer codes hiding behind the labels
unclass(factor_color)

Zwei Gewohnheiten sorgen für eine korrekte Auswahl. Führen Sie `sapply(df, class)` nach jedem Import aus, da ein einzelnes Zeichen in einer numerischen Spalte die gesamte Spalte in Text umwandelt. Konvertieren Sie die Daten außerdem so spät wie möglich in einen Faktor, nachdem sie bereinigt und zusammengeführt wurden. dplyr Joins und Filter vergleichen weiterhin einfache Zeichenketten anstatt nicht übereinstimmender Level-Sets.

Häufig gestellte Fragen

Wird `levels` nicht angegeben, ruft `factor()` die Funktion `unique()` auf und sortiert die Werte aufsteigend. Diese Sortierung hängt vom aktiven Gebietsschema ab und entspricht daher nicht immer reinem ASCII. Geben Sie das Argument `levels` explizit an, wenn die Reihenfolge relevant ist.

`table(f)` gibt für jede Ebene eine benannte Anzahl zurück, und `prop.table(table(f))` wandelt diese Anzahlen in Anteile um. Beide Funktionen lassen leere Ebenen sichtbar, was sie nützlich macht, um Kategorien zu erkennen, die nach dem Filtern verschwunden sind. Datenrahmen.

Die Funktion `factor()` vergleicht jedes Element mit den angegebenen Stufen. Werte ohne Übereinstimmung werden als `NA` behandelt, anstatt einen Fehler auszulösen. Überprüfen Sie vor der Konvertierung `setdiff(unique(x), your_levels)` und achten Sie auf Leerzeichen oder abweichende Groß- und Kleinschreibung in den Quelldaten.

Die Funktion `cut()` teilt einen numerischen Vektor an den angegebenen Trennpunkten und gibt einen Faktor zurück. Verwenden Sie Bezeichnungen für lesbare Bandnamen und setzen Sie `ordered_result = TRUE`, wenn die Bänder geordnet sind. Die Funktion `findInterval()` ist eine schnellere Alternative, wenn nur der Bin-Index benötigt wird.

Seit R 4.0.0 ist die Standardeinstellung für `data.frame()` und `read.csv()` `stringsAsFactors = FALSE`, sodass Textspalten als Zeichenketten behandelt werden. Ältere Skripte, die auf automatischer Konvertierung basierten, müssen nun `factor()` explizit für die zu modellierenden Spalten aufrufen.

Less als früher. Die R-Referenz weist darauf hin, dass identische Zeichenketten nun denselben Speicherplatz belegen, sodass der Unterschied in den meisten Fällen gering ist. Faktoren sind weiterhin nützlich, da sie Kategorien validieren und die Reihenfolge der Ebenen in Modellen und Diagrammen festlegen.

Die meisten Modellierungsfunktionen akzeptieren Faktoren direkt und erstellen automatisch Dummy-Kontraste, während viele Maschinelles Lernen Die Pakete erwarten eine numerische Matrix. model.matrix() oder One-Hot-Codierung schließen die Lücke, und ein geordneter Faktor kann seine Rangfolge beibehalten.

Ja. GitHub-Copilot Funktioniert in RStudio 2023.09.0 und höher und schlägt Vervollständigungen anhand der Kommentare und des Codes in der geöffneten Datei vor. Die Reihenfolge der Ebenen und der Umgang mit fehlenden Werten (NA) sind als Vorschläge zur Überprüfung und nicht als Fakten zu verstehen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: