Faktor i R: Kategoriska variabler och kontinuerliga variabler
โก Smart sammanfattning
Faktor i R lagrar kategoriska data som en vektor av heltalskoder parade med en uppsรคttning nivรฅer, vilket รคr hur sprรฅket separerar en begrรคnsad grupp kategorier frรฅn en kontinuerlig mรคtning.

Vad รคr faktor i R?
Faktor i R รคr en variabel som anvรคnds fรถr att kategorisera och lagra data, med ett begrรคnsat antal olika vรคrden. Den lagrar data som en vektor av heltalsvรคrden. Faktor i R รคr ocksรฅ kรคnd som en kategorisk variabel som lagrar bรฅde strรคng- och heltalsdatavรคrden som nivรฅer. Faktor anvรคnds mestadels i statistisk modellering och explorativ dataanalys med R.
Internt รคr en faktor tvรฅ objekt som fรคrdas tillsammans: en heltalsvektor av koder och ett teckenattribut med namnet nivรฅerVarje kod รคr en position i den nivรฅvektorn, vilket รคr anledningen till att utskrift av en faktor visar ord medan avklass() visar siffror.
I en datauppsรคttning kan vi sรคrskilja tvรฅ typer av variabler: kategorisk och kontinuerlig.
- I deskriptiv statistik fรถr kategoriska variabler i R รคr vรคrdet begrรคnsat och baseras vanligtvis pรฅ en viss รคndlig grupp. Till exempel kan en kategorisk variabel i R vara lรคnder, รฅr, kรถn, yrke.
- En kontinuerlig variabel kan dock anta vilka vรคrden som helst, frรฅn heltal till decimaltal. Till exempel kan vi ha intรคkten, priset pรฅ en aktie, etc.
Den distinktionen รคr vรคrd att bevaka, eftersom R i tysthet vรคljer olika standardvรคrden fรถr varje. En numerisk kolumn summeras med ett medelvรคrde och en median, medan en faktor summeras med antal per nivรฅ. Att lagra en kategori som text eller som ett tal รคndrar dรคrfรถr analysen man fรฅr. Den bredare uppsรคttningen lagringslรคgen behandlas i guiden till R-datatyper och operatorer.
Kategoriska variabler
Kategoriska variabler i R lagras i en faktor. Lรฅt oss titta pรฅ koden nedan fรถr att konvertera en teckenvariabel till en faktorvariabel i R. Mรฅnga modellerings- och maskininlรคrningsrutiner kan inte anvรคnda rรฅtext, sรฅ kategorierna mรฅste kodas som nivรฅer eller som tal innan modellen anpassas.
syntax
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Basreferensen fรถr R dokumenterar ytterligare tvรฅ argument som den fรถrkortade formen ovan utelรคmnar: utesluta, vilket tar bort vรคrden innan nivรฅuppsรคttningen byggs, och nmax, en รถvre grรคns fรถr antalet nivรฅer som pรฅskyndar konverteringen av mycket stora vektorer.
argument:
- xEn vektor med kategoriska data i R. Mรฅste vara en strรคng eller ett heltal, inte ett decimaltal.
- nivรฅerEn vektor med mรถjliga vรคrden tagna av x. Detta argument รคr valfritt. Standardvรคrdet รคr den unika listan med objekt i vektorn x, sorterade i stigande ordning.
- etiketterLรคgg till en etikett till de x kategoriska data i R. Till exempel kan 1 ta etiketten man medan 0, etiketten kvinna.
- uteslutaEn vektor med vรคrden som ska tas bort nรคr nivรฅuppsรคttningen bildas. Uteslutna vรคrden blir NA i resultatet.
- beordradeEn logisk flagga som avgรถr om nivรฅerna ska betraktas som ordnade, i den givna ordningen.
- nmaxEn valfri รถvre grรคns fรถr antalet nivรฅer, anvรคndbar fรถr lรฅnga vektorer.
Exempel:
Lรฅt oss konvertera en teckenvektor till en faktor och bekrรคfta รค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)
Produktion:
## [1] "character" ## [1] "factor"
Klassen bytte frรฅn tecken till faktor, och ingenting i de utskrivna vรคrdena รคndrades. Det รคr viktigt att transformera en strรคng till en faktorvariabel i R fรถre en maskininlรคrningsuppgift, eftersom det รคr den punkt dรฅ kategorierna blir en fast, validerad mรคngd.
En kategorisk variabel i R kan delas in i nominell kategorivariabel och ordinal kategorisk variabel.
Nominell Kategorisk Variabel
En nominell kategorisk variabel har flera vรคrden men ordningen spelar ingen roll. Till exempel, manlig eller kvinnlig. Nominella kategoriska variabler i R har ingen ordning.
# 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
Produktion:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Frรฅn factor_color kan vi inte se nรฅgon ordning. Nivรฅlistan รคr alfabetisk endast eftersom inget nivรฅargument angavs, sรฅ R sorterade de unika vรคrdena sjรคlvt. Den sorteringen fรถljer den aktiva sprรฅkinstรคllningen snarare รคn vanlig ASCII, vilket รคr en anledning att ange nivรฅerna explicit nรคr ordningen spelar roll.
Ordinal Kategorisk Variabel
Ordinala kategoriska variabler har en naturlig ordning. Rangordningen kommer frรฅn ordningen pรฅ vektorn som skickas till nivรฅer argument, och ordered = TRUE anger att R ska behandla den sekvensen som en rangordning snarare รคn en ren lista. Att sรคtta ordered = FALSE omvรคnder inte rangordningen; den producerar helt enkelt en vanlig oordnad faktor. Fรถr att rangordna frรฅn hรถgst till lรคgst, omvรคnd sjรคlva nivรฅvektorn.
Exempel:
Vi kan anvรคnda summering fรถr att rรคkna vรคrdena fรถr varje 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
Produktion:
## [1] evening morning afternoon midday
midnight evening
Konsolen skriver ut vรคrdena fรถrst och rankningen under. Nรคsta block รถppnas med den Levels-raden, fortfarande kommenterad, sรฅ rankningen fรถrblir synlig medan summary()-anropet lรคggs till i fรถregรฅende kod.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Produktion:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R ordnade nivรฅn frรฅn 'morgon' till 'midnatt' enligt argumentet nivรฅer. Eftersom faktorn รคr ordnad, fungerar jรคmfรถrelseoperatorer som < och > ocksรฅ pรฅ den, vilket de inte gรถr pรฅ den nominella fรคrgfaktorn ovan.
Kontinuerliga variabler
Kontinuerliga klassvariabler รคr standardvรคrdet i R. De lagras som numeriska tal eller heltal. Vi kan se det frรฅn datasetet nedan. mtcars รคr ett inbyggt dataset. Det samlar in information om olika typer av bilar. Vi kan importera det med hjรคlp av mtcars och kontrollera klassen fรถr variabeln mpg, mile per gallon. Den returnerar ett numeriskt vรคrde, vilket indikerar en kontinuerlig variabel.
dataset <- mtcars class(dataset$mpg)
Produktion
## [1] "numeric"
Inte alla numeriska kolumner รคr genuint kontinuerliga. I samma dataset innehรฅller cyl endast 4, 6 och 8, och am endast 0 och 1, sรฅ bรฅda รคr kategorier som rรฅkar lagras som tal. Att konvertera dem med factor() fรถre modellering hindrar R frรฅn att behandla gapet mellan 4 och 6 cylindrar som en uppmรคtt kvantitet. Den omvรคnda rรถrelsen, att skรคra en kontinuerlig kolumn i band, hanteras av cut().
Faktornivรฅer och etiketter i R
Attributet levels รคr den del av en faktor som du kommer att lรคgga mest tid pรฅ att justera, eftersom det styr bรฅde vad som skrivs ut och vad en modell behandlar som baslinje. Fyra bas-R-hjรคlpare tรคcker nรคstan alla fall.
| Funktion | Vad den gรถr | Typisk anvรคndning |
|---|---|---|
| nivรฅer (f) | Lรคser eller ersรคtter nivรฅnamnen | Byta namn pรฅ fรถrkortningar till lรคsbara etiketter |
| nivรฅer(f) | Returnerar antalet nivรฅer | Kontrollera att en kategori inte exploderade efter en join |
| relevel(f, ref) | Flyttar en nivรฅ framรฅt | Att vรคlja baslinje fรถr en regression |
| droppnivรฅer(f) | Tar bort nivรฅer med noll observationer | Rengรถring efter delmรคngd eller filtrering |
Blocket nedan tillรคmpar alla fyra pรฅ de fรคrg- och kรถnsfaktorer som skapades tidigare.
# 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])
Tvรฅ detaljer รคr vรคrda att komma ihรฅg. Att tilldela till levels() byter namn efter position, sรฅ en felaktig vektor omnamnlรคgger tyst fel kategori. Och en delmรคngd behรฅller varje ursprunglig nivรฅ tills droplevels() anropas, vilket รคr anledningen till att en filtrerad dataram kan fortfarande plotta tomma staplar. etiketter argumentet รคr annorlunda igen: det namnger nivรฅerna vid skapandet, och duplicerade etiketter sammanfogar flera indatavรคrden till en nivรฅ.
Hur man konverterar en faktor till numerisk eller tecken i R
Detta รคr den enskilt vanligaste faktorbuggen i R. Eftersom en faktor lagrar heltalskoder returnerar ett anrop av as.numeric() pรฅ den dessa koder snarare รคn de vรคrden du kan se pรฅ skรคrmen. En faktor fรถr รฅren 2021 till 2023 ger tillbaka vรคrdena 1, 2 och 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รคggande R-dokumentationen rekommenderar as.numeric(levels(f))[f] som den korrekta och nรฅgot snabbare vรคgen, med as.numeric(as.character(f)) som den mer lรคttlรคsta motsvarigheten. Bรฅda lรคser etiketten fรถrst och konverterar efterรฅt.
- Faktor till karaktรคras.character(f) returnerar etiketterna som vanlig text.
- Faktorisera till heltalskoderas.integer(f) eller unclass(f) nรคr koderna รคr vad du faktiskt vill ha.
- Tecken att faktorisera: factor(x) eller den snabbare genvรคgen as.factor(x).
- Numerisk till faktor: factor(x) fรถr diskreta koder, cut(x, breaks) fรถr kontinuerliga vรคrden som behรถver bandas.
En sรคkerhetsรฅtgรคrd gรคller fรถr alla. Om ett vรคrde i x inte visas i nivรฅvektorn, sรคtter factor() det elementet till NA istรคllet fรถr att generera ett fel, sรฅ ett lรถst mellanslag eller en skillnad i versaler kan i tysthet radera rader. Jรคmfรถrelse av unika vรคrden fรถre och efter konverteringen, eller sortera dataramen pรฅ den nya kolumnen, avslรถjar problemet snabbt.
Faktor vs. tecken vs. numerisk i R: Nรคr man ska anvรคnda varje
Att vรคlja lagringslรคge tidigt sparar mycket felsรถkning senare. Tabellen jรคmfรถr de tre lรคgen som en kolumn med text eller kod kan anta.
| Fast egendom | Faktor | Karaktรคr | Numerisk |
|---|---|---|---|
| Lagrad som | Heltalskoder plus ett levels-attribut | Strรคngar | Doubles eller heltal |
| Fast uppsรคttning vรคrden | Ja, definierad av nivรฅer | Nej | Nej |
| Anpassad visningsordning | Ja, genom nivรฅer | Endast alfabetisk | Endast numerisk |
| Aritmetik | Inte tillรฅtet | Inte tillรฅtet | Tillรฅten |
| Modellkontraster | Byggt automatiskt | Tvingades fรถrst | Behandlas som ett mรฅtt |
Anvรคnd faktor nรคr vรคrdena kommer frรฅn en kรคnd, sluten lista, nรคr visnings- eller rangordningsordningen spelar roll, eller nรคr kolumnen matar en modell eller en plottfรถrklaring. karaktรคr fรถr fri text, identifierare och allt du kommer att analysera eller koppla samman, sรฅsom namn, anteckningar och koder som stรคndigt anlรคnder med nya vรคrden. Anvรคnd numerisk endast nรคr avstรฅndet mellan tvรฅ vรคrden รคr meningsfullt.
Blocket nedan visar de snabbaste sรคtten att kontrollera vad du faktiskt 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)
Tvรฅ vanor hรฅller valet รคrligt. Kรถr sapply(df, class) efter varje import, eftersom ett enstaka lรถst tecken i en numerisk kolumn omvandlar hela kolumnen till text. Och konvertera till en faktor sรฅ sent som mรถjligt, efter att data har rensats och kopplats samman, sรฅ att dplyr kopplingar och filter jรคmfรถr fortfarande vanliga strรคngar snarare รคn nivรฅuppsรคttningar som inte matchar.
