Factor in R: categorische variabele en continue variabelen
โก Slimme samenvatting
In R slaat de parameter 'Factor' categorische gegevens op als een vector van integercodes gekoppeld aan een set niveaus. Op deze manier scheidt de taal een beperkte groep categorieรซn van een continue meting.

Wat is factor in R?
Factor in R Een factor is een variabele die wordt gebruikt om gegevens te categoriseren en op te slaan, met een beperkt aantal mogelijke waarden. De gegevens worden opgeslagen als een vector van gehele getallen. In R staat een factor ook bekend als een categorische variabele die zowel tekenreeks- als gehele getallen als niveaus opslaat. Factoren worden voornamelijk gebruikt in statistische modellen en verkennende data-analyse met R.
Internally bestaat een factor uit twee objecten die samen reizen: een integer vector van codes en een tekenkenmerk met de naam niveausElke code is een positie in die niveauvector, daarom worden bij het afdrukken van een factor woorden weergegeven. unclass() Toont getallen.
In een dataset kunnen we twee soorten variabelen onderscheiden: categorisch en doorlopend.
- In beschrijvende statistieken voor categorische variabelen in R is de waarde beperkt en meestal gebaseerd op een bepaalde eindige groep. Een categorische variabele in R kan bijvoorbeeld landen, jaar, geslacht, beroep zijn.
- Een continue variabele kan echter elke waarde aannemen, van een geheel getal tot een decimaal getal. We kunnen bijvoorbeeld de omzet, de prijs van een aandeel, enzovoort hebben.
Dat onderscheid is belangrijk om te bewaren, omdat R voor elk type kolom stilzwijgend verschillende standaardwaarden kiest. Een numerieke kolom wordt samengevat met een gemiddelde en een mediaan, terwijl een factor wordt samengevat met aantallen per niveau. Het opslaan van een categorie als tekst of als getal heeft daarom invloed op de analyse die je krijgt. De uitgebreidere set opslagmodi wordt behandeld in de handleiding. R-datatypen en -operatoren.
Categorische variabelen
Categorische variabelen in R worden opgeslagen in een factor. Laten we de onderstaande code bekijken om een โโtekenreeksvariabele in R om te zetten in een factorvariabele. Veel modelleer- en machine learning-routines kunnen geen onbewerkte tekst verwerken, dus de categorieรซn moeten worden gecodeerd als niveaus of als getallen voordat het model wordt getraind.
Syntaxis
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
De basisreferentie voor R beschrijft nog twee argumenten die in de bovenstaande verkorte versie ontbreken: uitsluiten, wat waarden verwijdert voordat de niveauset wordt opgebouwd, en nmax, een bovengrens voor het aantal niveaus dat de conversie van zeer grote vectoren versnelt.
Argumenten:
- xEen vector met categorische gegevens in R. Moet een tekenreeks of geheel getal zijn, geen decimaal getal.
- niveaus: Een vector met mogelijke waarden die x kan aannemen. Dit argument is optioneel. De standaardwaarde is de unieke lijst met elementen van de vector x, gesorteerd in oplopende volgorde.
- labelsVoeg een label toe aan de categorische gegevens x in R. Bijvoorbeeld, 1 kan het label 'man' krijgen en 0 het label 'vrouw'.
- uitsluitenEen vector met waarden die moeten worden weggelaten bij het vormen van de niveauset. Uitgesloten waarden worden NA in het resultaat.
- besteldeEen logische vlag die bepaalt of de niveaus als geordend moeten worden beschouwd, in de gegeven volgorde.
- nmax: Een optionele bovengrens voor het aantal niveaus, handig voor lange vectoren.
Voorbeeld:
Laten we een tekenreeksvector omzetten in een factor en de verandering bevestigen met 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)
Output:
## [1] "character" ## [1] "factor"
De klasse is overgeschakeld van tekenreeks naar factor, en er is niets veranderd aan de afgedrukte waarden. Het is belangrijk om een โโtransformatie uit te voeren. snaar in een factorvariabele in R vรณรณr een machine learning-taak, omdat dat het punt is waarop de categorieรซn een vaste, gevalideerde set vormen.
Een categorische variabele in R kan worden onderverdeeld in nominale categorische variabele en ordinale categorische variabele.
Nominale categorische variabele
Een nominale categorische variabele heeft meerdere waarden, maar de volgorde maakt niet uit. Bijvoorbeeld: man of vrouw. Nominale categorische variabelen in R hebben geen vaste volgorde.
# 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
Output:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Aan de hand van de factor_color kunnen we geen volgorde afleiden. De lijst met niveaus is alfabetisch, omdat er geen niveau-argument is opgegeven. R heeft de unieke waarden daarom zelf gesorteerd. Die sortering volgt de actieve landinstellingen in plaats van de standaard ASCII-indeling. Dit is een van de redenen om de niveaus expliciet te vermelden wanneer de volgorde ertoe doet.
Ordinale categorische variabele
Ordinale categorische variabelen hebben een natuurlijke ordening. De rangschikking is gebaseerd op de volgorde van de vector die aan de functie wordt doorgegeven. niveaus Het argument `ordered = TRUE` vertelt R om die reeks als een rangschikking te behandelen in plaats van als een gewone lijst. Het instellen van `ordered = FALSE` keert de rangschikking niet om; het produceert simpelweg een gewone, ongeordende factor. Om van hoog naar laag te rangschikken, moet je de `levels`-vector zelf omkeren.
Voorbeeld:
We kunnen samenvatting gebruiken om de waarden voor elke factorvariabele in R te tellen.
# 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
Output:
## [1] evening morning afternoon midday
midnight evening
De console print eerst de waarden en daaronder de rangschikking. Het volgende blok begint met die regel met 'Levels', die nog steeds is uitgeschakeld (uitgecommentarieerd), zodat de rangschikking zichtbaar blijft terwijl de aanroep van `summary()` aan de vorige code wordt toegevoegd.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Output:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R heeft het niveau geordend van 'ochtend' tot 'middernacht' zoals gespecificeerd in het argument 'levels'. Omdat de factor geordend is, werken vergelijkingsoperatoren zoals < en > er ook op, wat niet het geval is bij de nominale kleurfactor hierboven.
Continue variabelen
Continue variabelen zijn de standaardwaarde in R. Ze worden opgeslagen als numerieke waarden of gehele getallen. Dit is te zien in de onderstaande dataset. `mtcars` is een ingebouwde dataset die informatie verzamelt over verschillende soorten auto's. We kunnen deze importeren met `mtcars` en de klasse van de variabele `mpg` (mile per gallon) controleren. Deze retourneert een numerieke waarde, wat aangeeft dat het een continue variabele is.
dataset <- mtcars class(dataset$mpg)
uitgang
## [1] "numeric"
Niet elke numerieke kolom is daadwerkelijk continu. In dezelfde dataset bevat `cyl` alleen de waarden 4, 6 en 8, en `am` alleen de waarden 0 en 1. Beide zijn dus categorieรซn die toevallig als getallen zijn opgeslagen. Door ze vรณรณr het modelleren met `factor()` om te zetten, voorkomt R dat de kloof tussen 4 en 6 cilinders als een gemeten hoeveelheid wordt behandeld. De omgekeerde bewerking, het opdelen van een continue kolom in banden, wordt uitgevoerd met `cut()`.
Factorniveaus en labels in R
Het attribuut 'levels' is het onderdeel van een factor dat u het meest zult aanpassen, omdat het bepaalt wat er wordt afgedrukt en wat een model als basislijn beschouwt. Vier standaard R-helpers dekken vrijwel alle gevallen.
| Functie | Wat het doet | Typisch gebruik |
|---|---|---|
| niveaus(f) | Leest of vervangt de niveaunamen. | Afkortingen hernoemen naar leesbare labels |
| nlevels(f) | Geeft het aantal niveaus terug | Het controleren van een categorie leidde niet tot een explosie na een samenvoeging. |
| relevel(f, ref) | Schuift รฉรฉn niveau naar voren | Het kiezen van de basislijn voor een regressieanalyse |
| droplevels(f) | Verwijdert niveaus met nul waarnemingen. | Opruimen na het selecteren of filteren. |
Het onderstaande blok past alle vier de factoren toe op de eerder gecreรซerde kleur- en geslachtsfactoren.
# 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])
Twee details zijn het onthouden waard. Toewijzing aan levels() hernoemt op basis van positie, dus een niet-overeenkomende vector hernoemt stilletjes de verkeerde categorie. En een subset behoudt elk origineel niveau totdat droplevels() wordt aangeroepen, vandaar dat een gefilterde dataframe Het is nog steeds mogelijk om lege balken weer te geven. labels Het argument is weer anders: het benoemt de niveaus tijdens het aanmaken, en dubbele labels voegen meerdere invoerwaarden samen tot รฉรฉn niveau.
Hoe converteer je een factor naar een numerieke waarde of tekenreeks in R?
Dit is de meest voorkomende factorfout in R. Omdat een factor integercodes opslaat, geeft een aanroep van `as.numeric()` die codes terug in plaats van de waarden die je op het scherm ziet. Een factor van de jaren 2021 tot en met 2023 geeft als resultaat 1, 2 en 3.
# 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)
De standaard R-documentatie beveelt `as.numeric(levels(f))[f]` aan als de correcte en iets snellere methode, met `as.numeric(as.character(f))` als het beter leesbare equivalent. Beide methoden lezen eerst het label en converteren daarna.
- Factor voor karakter: as.character(f) retourneert de labels als platte tekst.
- Factor naar gehele getallen codes: as.integer(f) of unclass(f) wanneer de codes zijn wat je daadwerkelijk wilt.
- Karakter naar factor: factor(x) of de snellere snelkoppeling as.factor(x).
- Numeriek naar factor: factor(x) voor discrete codes, cut(x, breaks) voor continue waarden die gebandeerd moeten worden.
Eรฉn beveiliging is op al deze manieren van toepassing. Als een waarde in x niet voorkomt in de level-vector, stelt factor() dat element in op NA in plaats van een foutmelding te geven. Zo kan een losse spatie of een verschil in hoofdlettergebruik ongemerkt rijen verwijderen. Vergelijk unieke waarden vรณรณr en na de conversie, of het dataframe sorteren De nieuwe kolom legt het probleem snel bloot.
Factor versus teken versus numeriek in R: wanneer gebruik je welke?
Door vroegtijdig de opslagmodus te kiezen, bespaar je later veel debugwerk. De tabel vergelijkt de drie modi die een kolom met tekst of code kan aannemen.
| Eigendom | Factor | Karakter | Numerieke |
|---|---|---|---|
| Opgeslagen als | Gehele getallen plus een niveaukenmerk | Strings | Doubles of gehele getallen |
| Vaste set waarden | Ja, gedefinieerd door niveaus. | Nee | Nee |
| Aangepaste displaybestelling | Ja, via niveaus | Alleen alfabetisch | Alleen numeriek |
| Rekenkunde | Niet toegestaan | Niet toegestaan | Toegestaan |
| Modelcontrasten | Automatisch gebouwd | Eerst gedwongen | Beschouwd als een meetwaarde |
Gebruik een factor Gebruik dit wanneer de waarden afkomstig zijn uit een bekende, gesloten lijst, wanneer de weergave- of rangschikkingsvolgorde van belang is, of wanneer de kolom gegevens levert aan een model of een legenda van een grafiek. karakter Voor vrije tekst, identificatoren en alles wat je wilt parseren of samenvoegen, zoals namen, notities en codes die steeds met nieuwe waarden binnenkomen. Gebruik numerieke alleen wanneer de afstand tussen twee waarden betekenisvol is.
Het onderstaande blok toont de snelste manieren om te controleren wat je daadwerkelijk hebt.
# 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)
Twee gewoontes zorgen ervoor dat de keuze eerlijk blijft. Voer `sapply(df, class)` uit na elke import, omdat een enkel verkeerd teken in een numerieke kolom de hele kolom in tekst verandert. En converteer naar een factor zo laat mogelijk, nadat de gegevens zijn opgeschoond en samengevoegd, zodat dplyr Bij joins en filters worden nog steeds gewone tekenreeksen vergeleken in plaats van niet-overeenkomende niveausets.
