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.

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.
