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.

  • ๐Ÿท๏ธ Strukturera: En faktor innehรฅller heltalskoder plus ett nivรฅattribut, sรฅ varje kategori valideras mot en fast lista.
  • ๐Ÿงฉ Skapande: factor() konverterar en teckenvektor, och class() bekrรคftar resultatet som รคndrats frรฅn tecken till faktor.
  • ๐Ÿ”˜ Nominell: Utan ett nivรฅargument sorterar R kategorierna sjรคlvt, sรฅ ingen rangordning mellan fรคrger eller kรถn antyds.
  • ๐Ÿ“Š Ordinal: Om ordered = TRUE skickas med en explicit nivรฅvektor fixeras rankningen frรฅn lรคgst till hรถgst.
  • ๐Ÿ”ข Kontinuerlig: Numeriska kolumner och heltalskolumner fรถrblir kontinuerliga som standard, vilket class(mtcars$mpg) visar.
  • โš ๏ธ Konverteringsfรคlla: as.numeric() pรฅ en faktor returnerar nivรฅkoderna, sรฅ lรคs etiketten genom levels() fรถrst.
  • ๐Ÿง  Underhรฅll: relevel() sรคtter modellens baslinje och droplevels() rensar kategorier som lรคmnats kvar av en delmรคngd.

Faktorisera in R kategoriska variabler och kontinuerliga variabler

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.

Vanliga frรฅgor

Nรคr levels inte anges, anropar factor() unique() och sorterar vรคrdena i stigande ordning. Den sorteringen beror pรฅ den aktiva sprรฅkinstรคllningen, sรฅ den รคr inte alltid ren ASCII. Ange levels-argumentet explicit nรคrhelst ordningen har betydelse.

table(f) returnerar ett namngivet antal fรถr varje nivรฅ, och prop.table(table(f)) konverterar dessa antal till proportioner. Bรฅda hรฅller tomma nivรฅer synliga, vilket gรถr dem anvรคndbara fรถr att hitta kategorier som fรถrsvann efter filtrering. dataram.

factor() matchar varje element mot de nivรฅer du angav, och alla vรคrden utan matchning blir NA istรคllet fรถr att orsaka ett fel. Kontrollera setdiff(unique(x), your_levels) innan du konverterar, och se upp fรถr lรถsa mellanslag eller olika versaler i kรคlldata.

cut() delar en numerisk vektor vid de brytpunkter du anger och returnerar en faktor. Skicka etiketter fรถr lรคsbara bandnamn och ordered_result = TRUE nรคr banden rangordnar. findInterval() รคr ett snabbare alternativ nรคr endast bin-index behรถvs.

Sedan R 4.0.0 รคr den fabriksnya standardinstรคllningen fรถr data.frame() och read.csv() stringsAsFactors = FALSE, sรฅ textkolumner behรฅller tecken. ร„ldre skript som fรถrlitade sig pรฅ automatisk konvertering mรฅste nu anropa factor() explicit pรฅ de kolumner de modellerar.

Less รคn de en gรฅng gjorde. Basreferensen i R noterar att identiska strรคngar nu delar lagring, sรฅ gapet รคr litet i de flesta fall. Faktorer lรถnar sig fortfarande genom att validera kategorier och genom att fixera nivรฅordningen som anvรคnds i modeller och plottar.

De flesta modelleringsfunktioner accepterar faktorer direkt och bygger dummykontraster automatiskt, medan mรฅnga maskininlรคrning Paket fรถrvรคntar sig en numerisk matris. model.matrix() eller en-hot-kodning รถverbryggar gapet, och en ordnad faktor kan behรฅlla sin rangordning.

Ja. GitHub Copilot Fungerar i RStudio 2023.09.0 och senare och fรถreslรฅr kompletteringar frรฅn kommentarerna och koden i den รถppna filen. Behandla nivรฅordning och NA-hantering som fรถrslag fรถr att verifiera, inte fakta.

Sammanfatta detta inlรคgg med: