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.

  • ???? ๏ธ Structuur: Een factor bevat integercodes plus een niveaukenmerk, waardoor elke categorie wordt gevalideerd aan de hand van een vaste lijst.
  • ๐Ÿงฉ Creation: factor() converteert een tekenreeksvector, en class() bevestigt dat het resultaat is omgezet van tekenreeks naar factor.
  • ๐Ÿ”˜ Nominaal: Zonder een 'levels'-argument sorteert R de categorieรซn zelf, waardoor er geen rangschikking tussen kleuren of geslachten wordt geรฏmpliceerd.
  • ๐Ÿ“Š ordinaal: Door `ordered = TRUE` mee te geven aan een expliciete `levels`-vector wordt de rangschikking van laag naar hoog vastgelegd.
  • ๐Ÿ”ข continu: Numerieke en gehele kolommen blijven standaard aaneengesloten, zoals class(mtcars$mpg) aantoont.
  • โš ๏ธ Conversieval: as.numeric() op een factor retourneert de niveaucodes, dus lees eerst het label via levels().
  • ???? Onderhoud: relevel() stelt de basislijn van het model in en droplevels() verwijdert categorieรซn die door een subset zijn achtergelaten.

Factor in R Categorische variabele en continue variabelen

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.

Veelgestelde vragen

Als levels niet wordt meegegeven, roept factor() unique() aan en sorteert de waarden in oplopende volgorde. Die sortering is afhankelijk van de actieve landinstellingen, dus het is niet altijd gewoon ASCII. Geef het argument levels expliciet mee wanneer de sortering van belang is.

`table(f)` retourneert een benoemd aantal voor elk niveau, en `prop.table(table(f))` zet die aantallen om in proporties. Beide functies houden lege niveaus zichtbaar, waardoor ze handig zijn om categorieรซn te vinden die verdwenen zijn na het filteren van een categorie. dataframe.

De functie `factor()` vergelijkt elk element met de door u opgegeven niveaus. Elke waarde die niet overeenkomt, wordt als `NA` gemarkeerd in plaats van een foutmelding te geven. Controleer `setdiff(unique(x), your_levels)` vรณรณr de conversie en let op overtollige spaties of afwijkend hoofdlettergebruik in de brongegevens.

`cut()` splitst een numerieke vector op de door u opgegeven breekpunten en retourneert een factor. Geef labels door voor leesbare bandnamen en `ordered_result = TRUE` wanneer de banden gerangschikt zijn. `findInterval()` is een sneller alternatief wanneer alleen de bin-index nodig is.

Sinds R 4.0.0 is de standaardinstelling voor `data.frame()` en `read.csv()` stringsAsFactors = FALSE, waardoor tekstkolommen karakters blijven. Oudere scripts die vertrouwden op automatische conversie moeten nu expliciet `factor()` aanroepen op de kolommen die ze modelleren.

Less dan vroeger. De basisreferentie van R merkt op dat identieke tekenreeksen nu dezelfde opslagruimte delen, waardoor het verschil in de meeste gevallen klein is. Factoren blijven nuttig door categorieรซn te valideren en de volgorde van niveaus in modellen en grafieken te corrigeren.

De meeste modelleringsfuncties accepteren factoren direct en bouwen automatisch dummy-contrasten op, terwijl veel machine learning Pakketten verwachten een numerieke matrix. `model.matrix()` of one-hot-codering overbrugt deze kloof, en een geordende factor kan zijn rangorde behouden.

Ja. GitHub-copiloot Werkt in RStudio 2023.09.0 en later en suggereert aanvullingen op basis van de opmerkingen en code in het geopende bestand. Beschouw de volgorde van niveaus en de afhandeling van NA-waarden als suggesties ter verificatie, niet als feiten.

Vat dit bericht samen met: