Faktor i R: Kategoriske variable og kontinuerte variable

⚡ Smart opsummering

Faktor i R lagrer kategoriske data som en vektor af heltalskoder parret med et sæt niveauer, hvilket er sådan sproget adskiller en begrænset gruppe af kategorier fra en kontinuerlig måling.

  • 🏷️ Struktur: En faktor indeholder heltalskoder plus en niveauattribut, så hver kategori valideres mod en fast liste.
  • 🧩 Skabelse: factor() konverterer en tegnvektor, og class() bekræfter resultatet, der er ændret fra tegn til faktor.
  • 🔘 Nominel: Uden et niveauargument sorterer R selv kategorierne, så der er ingen underforstået rangordning mellem farver eller køn.
  • 📊 Ordinal: Ved at bestå ordered = TRUE med en eksplicit niveauvektor fastsættes rangeringen fra laveste til højeste.
  • 🔢 Sammenhængende: Numeriske og heltalskolonner forbliver som standard kontinuerlige, som class(mtcars$mpg) viser.
  • ⚠️ Konverteringsfælde: as.numeric() på en faktor returnerer niveaukoderne, så læs først etiketten gennem levels().
  • 🧠 Vedligeholdelse: relevel() sætter modellens basislinje, og droplevels() rydder kategorier, der er efterladt af en delmængde.

Faktor i R kategoriske variabler og kontinuerlige variabler

Hvad er faktor i R?

Faktor i R er en variabel, der bruges til at kategorisere og gemme data, og som har et begrænset antal forskellige værdier. Den gemmer dataene som en vektor af heltalsværdier. Faktor i R er også kendt som en kategorisk variabel, der gemmer både streng- og heltalsdataværdier som niveauer. Faktor bruges mest i statistisk modellering og udforskende dataanalyse med R.

Internt er en faktor to objekter, der bevæger sig sammen: en heltalsvektor af koder og en tegnattribut med navnet niveauerHver kode er en position i det niveau, hvilket er grunden til at udskrivning af en faktor viser ord, mens uklasse() viser tal.

I et datasæt kan vi skelne mellem to typer variabler: kategorisk og kontinuerlig.

  • I beskrivende statistik for kategoriske variable i R er værdien begrænset og normalt baseret på en bestemt endelig gruppe. For eksempel kan en kategorisk variabel i R være lande, år, køn, erhverv.
  • En kontinuert variabel kan dog antage alle værdier, fra heltal til decimaltal. For eksempel kan vi have omsætningen, prisen på en aktie osv.

Den sondring er værd at vogte over, fordi R i stilhed vælger forskellige standardværdier for hver. En numerisk kolonne opsummeres med et gennemsnit og en median, mens en faktor opsummeres med antal pr. niveau. Lagring af en kategori som tekst eller som et tal ændrer derfor den analyse, man får. Det bredere sæt af lagringstilstande er dækket i guiden til R-datatyper og operatorer.

Kategoriske variabler

Kategoriske variabler i R gemmes i en faktor. Lad os tjekke koden nedenfor for at konvertere en tegnvariabel til en faktorvariabel i R. Mange modellerings- og maskinlæringsrutiner kan ikke forbruge rå tekst, så kategorierne skal kodes som niveauer eller som tal, før modellen tilpasses.

Syntaks

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

Basis-R-referencen dokumenterer to yderligere argumenter, som den forkortede form ovenfor udelader: udelukke, som fjerner værdier, før niveausættet er bygget, og nmax, en øvre grænse for antallet af niveauer, der fremskynder konverteringen af ​​meget store vektorer.

argumenter:

  • xEn vektor af kategoriske data i R. Skal være en streng eller et heltal, ikke et decimaltal.
  • niveauerEn vektor af mulige værdier taget af x. Dette argument er valgfrit. Standardværdien er den unikke liste over elementer i vektoren x, sorteret i stigende rækkefølge.
  • etiketterTilføj en etiket til de x kategoriske data i R. For eksempel kan 1 tage etiket mand, mens 0, etiket kvinde.
  • udelukkeEn vektor af værdier, der skal udelades, når niveausættet dannes. Udelukkede værdier bliver NA i resultatet.
  • bestiltEt logisk flag, der bestemmer, om niveauerne skal betragtes som ordnede i den givne rækkefølge.
  • nmaxEn valgfri øvre grænse for antallet af niveauer, nyttig for lange vektorer.

Eksempel:

Lad os konvertere en tegnvektor til en faktor og bekræfte ændringen med 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"

Klassen skiftede fra tegn til faktor, og intet ved de udskrevne værdier ændrede sig. Det er vigtigt at transformere en streng til en faktorvariabel i R før en maskinlæringsopgave, fordi det er det punkt, hvor kategorierne bliver et fast, valideret sæt.

En kategorisk variabel i R kan opdeles i nominel kategorisk variabel og ordinal kategorisk variabel.

Nominel Kategorisk Variabel

En nominel kategorisk variabel har flere værdier, men rækkefølgen er ligegyldig. For eksempel mandlig eller kvindelig. Nominelle kategoriske variabler i R har ingen rækkefølge.

# 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

Ud fra factor_color kan vi ikke se nogen rækkefølge. Niveaulisten er kun alfabetisk, fordi der ikke blev angivet noget niveauargument, så R sorterede selv de unikke værdier. Denne sortering følger den aktive lokalitet i stedet for almindelig ASCII, hvilket er en af ​​grundene til at angive niveauerne eksplicit, når rækkefølgen er vigtig.

Ordinal Kategorisk Variabel

Ordinale kategoriske variabler har en naturlig ordning. Rangordenen kommer fra rækkefølgen af ​​vektoren, der sendes til niveauer argument, og ordered = TRUE fortæller R, at sekvensen skal behandles som en rangordning snarere end en ren liste. At sætte ordered = FALSE vender ikke rangordningen om; den producerer blot en almindelig uordnet faktor. For at rangere fra højeste til laveste, vend selve niveauvektoren om.

Eksempel:

Vi kan bruge opsummering til at tælle værdierne for hver faktorvariabel i R.

# 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

Konsollen udskriver værdierne først og rangeringen nedenunder. Den næste blok åbner med den pågældende Levels-linje, stadig kommenteret ud, så rangeringen forbliver synlig, mens summary()-kaldet tilføjes til den forrige kode.

## 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 ordnede niveauet fra 'morgen' til 'midnat' som angivet i niveauargumentet. Fordi faktoren er ordnet, arbejder sammenligningsoperatorer som < og > også på den, hvilket de ikke gør på den nominelle farvefaktor ovenfor.

Kontinuerlige variabler

Kontinuerlige klassevariabler er standardværdien i R. De gemmes som numeriske eller heltallige. Vi kan se det fra datasættet nedenfor. mtcars er et indbygget datasæt. Det indsamler information om forskellige typer biler. Vi kan importere det ved hjælp af mtcars og kontrollere klassen for variablen mpg, mile per gallon. Det returnerer en numerisk værdi, der angiver en kontinuerlig variabel.

dataset <- mtcars
class(dataset$mpg)

Produktion

## [1] "numeric"

Ikke alle numeriske kolonner er ægte kontinuerlige. I det samme datasæt indeholder cyl kun 4, 6 og 8, og am indeholder kun 0 og 1, så begge er kategorier, der tilfældigvis er gemt som tal. Konvertering af dem med factor() før modellering forhindrer R i at behandle afstanden mellem 4 og 6 cylindre som en målt størrelse. Den omvendte bevægelse, hvor en kontinuerlig kolonne skæres i bånd, håndteres af cut().

Faktorniveauer og etiketter i R

Levels-attributten er den del af en faktor, du bruger mest tid på at justere, fordi den styrer både, hvad der udskrives, og hvad en model behandler som baseline. Fire base R-hjælpere dækker næsten alle tilfælde.

Funktion Hvad gør den Typisk brug
niveauer (f) Læser eller erstatter niveaunavnene Omdøbning af forkortelser til læsbare etiketter
niveauer(f) Returnerer antallet af niveauer Kontrol af, at en kategori ikke eksploderede efter en join
genniveau(f, ref) Flytter et niveau fremad Valg af baseline for en regression
dråbeniveauer(f) Fjerner niveauer med nul observationer Oprydning efter underindstilling eller filtrering

Blokken nedenfor anvender alle fire på de farve- og kønsfaktorer, der blev oprettet tidligere.

# 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])

To detaljer er værd at huske. Tildeling til levels() omdøber efter position, så en uoverensstemmende vektor omdøber lydløst den forkerte kategori. Og en delmængde beholder hvert originale niveau, indtil droplevels() kaldes, hvilket er grunden til, at en filtreret dataramme kan stadig plotte tomme søjler. etiketter argumentet er igen anderledes: det navngiver niveauerne på oprettelsestidspunktet, og duplikerede etiketter fletter flere inputværdier sammen til ét niveau.

Sådan konverterer du en faktor til numerisk eller tegn i R

Dette er den mest almindelige faktorfejl i R. Fordi en faktor gemmer heltalskoder, returnerer et kald af as.numeric() på den disse koder i stedet for de værdier, du kan se på skærmen. En faktor fra årene 2021 til 2023 returnerer som 1, 2 og 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)

Den grundlæggende R-dokumentation anbefaler as.numeric(levels(f))[f] som den korrekte og lidt hurtigere rute, med as.numeric(as.character(f)) som den lettere læselige ækvivalent. Begge læser etiketten først og konverterer bagefter.

  • Faktor til karakteras.character(f) returnerer etiketterne som almindelig tekst.
  • Faktor til heltalskoderas.integer(f) eller unclass(f) når koderne er, hvad du rent faktisk ønsker.
  • Karakter at faktorisere: factor(x) eller den hurtigere genvejsmetode som .factor(x).
  • Numerisk til faktorfactor(x) for diskrete koder, cut(x, breaks) for kontinuerlige værdier, der kræver banding.

Én sikkerhedsforanstaltning gælder for dem alle. Hvis en værdi i x ikke vises i niveauvektoren, sætter factor() elementet til NA i stedet for at generere en fejl, så et spredt mellemrum eller en forskel i store bogstaver kan slette rækker i stilhed. Sammenligning af unikke værdier før og efter konverteringen, eller sortering af datarammen på den nye kolonne, afslører problemet hurtigt.

Faktor vs. tegn vs. numerisk i R: Hvornår skal man bruge hver

Tidlig valg af lagringstilstand sparer en masse fejlfinding senere. Tabellen sammenligner de tre tilstande, en tekstkolonne eller koder kan antage.

Ejendom faktor Character Numerisk
Gemt som Heltalskoder plus en levels-attribut Strings Doubles eller heltal
Fast sæt af værdier Ja, defineret af niveauer Ingen Ingen
Tilpasset visningsrækkefølge Ja, gennem niveauer Kun alfabetisk Kun numerisk
Aritmetik Ikke tilladt Ikke tilladt Tilladt
Modelkontraster Bygget automatisk Tvunget først Behandlet som en måling

Brug faktor når værdierne kommer fra en kendt, lukket liste, når visnings- eller rangordenen har betydning, eller når kolonnen indeholder en model- eller plotforklaring. karakter til fri tekst, identifikatorer og alt, hvad du vil analysere eller sammenføje, såsom navne, noter og koder, der bliver ved med at ankomme med nye værdier. Brug numerisk kun når afstanden mellem to værdier er meningsfuld.

Blokken nedenfor viser de hurtigste måder at tjekke, hvad du rent faktisk har.

# 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)

To vaner holder valget ærligt. Kør sapply(df, class) efter hver import, fordi et enkelt tilfældigt tegn i en numerisk kolonne omdanner hele kolonnen til tekst. Og konverter til en faktor så sent som muligt, efter dataene er renset og sammenføjet, så dplyr joinforbindelser og filtre sammenligner stadig almindelige strenge i stedet for uoverensstemmende niveausæt.

Ofte Stillede Spørgsmål

Når levels ikke angives, kalder factor() unique() og sorterer værdierne i stigende rækkefølge. Denne sortering afhænger af den aktive lokalitet, så den er ikke altid ren ASCII. Angiv levels-argumentet eksplicit, når rækkefølgen har betydning.

table(f) returnerer et navngivet antal for hvert niveau, og prop.table(table(f)) konverterer disse antal til proportioner. Begge holder tomme niveauer synlige, hvilket gør dem nyttige til at finde kategorier, der forsvandt efter filtrering. dataramme.

factor() matcher hvert element mod de niveauer, du har angivet, og enhver værdi uden match bliver NA i stedet for at forårsage en fejl. Tjek setdiff(unique(x), your_levels) før konvertering, og hold øje med tilfældige mellemrum eller forskellig brug af store bogstaver i kildedataene.

cut() opdeler en numerisk vektor ved de brudpunkter, du angiver, og returnerer en faktor. Sender labels til læsbare båndnavne, og ordered_result = TRUE, når båndene rangerer. findInterval() er et hurtigere alternativ, når kun bin-indekset er nødvendigt.

Siden R 4.0.0 er den fabriksnye standard for data.frame() og read.csv() stringsAsFactors = FALSE, så tekstkolonner forbliver tegn. Ældre scripts, der var afhængige af automatisk konvertering, skal nu kalde factor() eksplicit på de kolonner, de modellerer.

Less end de engang gjorde. Den grundlæggende R-reference bemærker, at identiske strenge nu deler lagerplads, så forskellen er lille i de fleste tilfælde. Faktorer betaler sig stadig ved at validere kategorier og ved at fastsætte den niveaurækkefølge, der bruges i modeller og plots.

De fleste modelleringsfunktioner accepterer faktorer direkte og opbygger automatisk dummykontraster, mens mange machine learning Pakker forventer en numerisk matrix. model.matrix() eller one-hot-kodning bygger bro over hullet, og en ordnet faktor kan bevare sin rangering.

Ja. GitHub Copilot Fungerer i RStudio 2023.09.0 og nyere og foreslår kompletteringer ud fra kommentarer og kode i den åbne fil. Behandl niveaurækkefølge og NA-håndtering som forslag til verifikation, ikke fakta.

Opsummer dette indlæg med: