Variables i tipus
Una variable és una característica del fenomen que estudiem que varia entre els casos i, per tant, pot prendre diversos valors. Tenim quatre tipus de variables:
Variables categòriques
Tenim principalment tres tipus de variables categòriques: nominals, ordinals i binàries. Qualsevol d’aquests tres tipus es pot emmagatzemar a R com a vectors de caràcter, factors o vectors lògics. La manera com l’emmagatzamem dependrà de la utilitat que li vulguem donar:
- Nominals: Vectors de caràcter, factors o vectors lògics.
- Ordinals: Factors o vectors lògics.
- Binàries: Factors o vectors lògics.
Font: Alison Horst.
Variables categòriques nominals
Les variables categòriques nominals es poden emmagatzemar a R com a vectors de caràcter, com a factors o com a vectors lògics.
Operacions: Amb les variables categòriques nominals es poden fer les següents operacions d’igualtat.
Igual: ==
No igual: !=
Caràcters
Els vectors de caràcter o strings emmagatzemen tot tipus de caràcters, des de lletres fins a símbols especials. Sempre utilitzarem les cometes per a referir-nos a cada valor. Crearem un vector de caràcter de la següent manera:
vector_caracter <- c("Kuwait", "Qatar", "Saudi Arabia", "Bahrain")
Per poder modificar fàcilment els vectors de caràcter, un dels paquets amb més possibilitats és el paquet stringr.
Factors
Un factor és un vector enter que emmagatzema informació categòrica. Normalment crearem els factors a partir d’un vector caràcter i el passarem a factor amb la funció factor()
1 de la següent manera:
paisos <- factor(c("BRA", "ARG", "VEN", "URU", "PAR")) #creem un vector de caràcter
paisos #observem el vector
levels(paisos) #mirem els nivells
A continuació veiem com modificar els nivells d’un factor:
#podem modificar els nivells de la següent manera:
levels(paisos) <- c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela")
paisos #comprovem els resultats
#també podem modificar un sol nivell
levels(paisos)[4] <- c("URUGUAY")
paisos #comprovem els resultats
#o podem modificar els nivells a través d'un argument a la funció factor
factor(paisos, labels = c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela"))
Per manipular factors és molt útil el paquet forcats.
Lògics
En un vector lògic la variable només pot tenir dos valors discrets i normalment no ordenables: veritat (TRUE
) i fals (FALSE
). En aquest cas es tractarà d’una variable binària (també dita dicotòmica, booleana o dummy), que normalment serveix per a indicar la presència o absència d’un determinat concepte. Si el concepte és present, la variable prèn el valor lògic TRUE, si el concepte és absent, prèn el valor lògic FALSE. Crearem un vector lògic de la següent manera:
vector_logic <- c(TRUE, FALSE, FALSE, TRUE)
Variables categòriques ordinals
Les variables ordinals són variables categòriques que es poden ordenar de manera lògica. També les podem emmagatzemar com a vectors de caràcter, factors o vectors lògics, encara que amb algunes petites diferències en relació als factors i els vectors lògics.
Operacions: Amb les variables categòriques ordinals es poden fer les següents operacions d’igualtat.
Igual: ==
No igual: !=
Més gran o igual que: >=
Més petit o igual que: <=
Més gran que: >
Més petit que: <
Factors
Els factors són una de les eines principals que tenim per a emmagatzemar variables categòriques. El seu gran potencial és la manera com poden guardar variables ordinals, ja que tenen la capacitat d’ordenar les categories seguint l’ordre que indiquem. Fixeu-vos en el marc de dades que creem, on tenim una variable categòrica ordinal. Un cop creat, imprimim el marc de dades teclejant wb
.
wb <- data.frame(country = c("Antigua and Barbuda", "Belize", "Costa Rica", "Dominica", "Dominican Republic",
"El Salvador", "Guyana", "Guatemala", "Haiti", "Honduras", "Jamaica", "Nicaragua",
"Panama", "Surinam", "Trinidad and Tobago"),
income = factor(c("high", "upper-middle", "upper-middle","upper-middle", "upper-middle",
"lower-middle", "upper-middle", "upper-middle","low", "lower-middle", "upper-middle",
"lower-middle", "high", "upper-middle", "high")),
stringsAsFactors = FALSE)
country | income |
---|---|
Antigua and Barbuda | high |
Belize | upper-middle |
Costa Rica | upper-middle |
Dominica | upper-middle |
Dominican Republic | upper-middle |
El Salvador | lower-middle |
Guyana | upper-middle |
Guatemala | upper-middle |
Haiti | low |
Honduras | lower-middle |
Jamaica | upper-middle |
Nicaragua | lower-middle |
Panama | high |
Surinam | upper-middle |
Trinidad and Tobago | high |
Fixeu-vos en el procediment per convertir un factor en ordinal:
- A dins de la funció
factor()
, indiquem que l’argumentorder
a TRUE. - Indiquem a l’argument
levels
l’ordre dels factors, de menor a major.
wb$income <- factor(wb$income, order = TRUE,
levels = c("low", "lower-middle", "upper-middle", "high"))
Comproveu el resultat amb:
class(wb$income)
wb$income
Vectors lògics
Els vectors lògics també poden operar com a variable categòrica ordinal pel simple fet que TRUE és convertible a 1 i FALSE és convertible a 0. Fixem-nos què passa si convertim un vector lògic a vector numèric.
as.numeric(c(TRUE, FALSE))
## [1] 1 0
Això significa que TRUE pot ser interpretat com un 1 i FALSE com un 0. Per il·lustrar-ho crearem un marc de dades format per dos vectors, country i poverty. Primer creem els vectors i, a partir dels vectors, creem el marc de dades.
country = c("Armenia", "Austria", "Benin", "Bolivia", "Brazil", "Colombia",
"El Salvador", "Ethiopia", "Honduras", "Indonesia")
poverty = c(1.90, 0.7, 49.6, 6.4, 3.4, 4.5, 1.9, 26.7, 16.2, 7.2)
pov <- data.frame(country, poverty)
Observeu com qualsevol vector és convertible en un vector lògic. Mireu els següents exemples:
pov$country == "Benin" #preguntem si algun element del vector country porta el nom Benin
## [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
pov$poverty < 16 #preguntem si algun element del vector *poverty* és inferior a 16
## [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
Per passar qualsevol tipus de vector a vector lògic haurem de dominar els operadors relacionals. Aquest vídeo fa un resum dels operadors que hem vist fins ara:
Font: DatacampPer combinar varis resultats lògics és essencial que comprengueu com funcionen els operadors booleans:
- AND: Utilitzarem el símbol
&
- OR: Utilitzarem el símbol
|
- NOT: Utilitzarem el símbol
!=
El següent vídeo us ho explica.
Font: DatacampVegem alguns exemples de com funcionen els operadors booleans:
pov$country == "Austria" | pov$poverty < 15
pov$country == "Austria" & pov$poverty < 15
!pov$country == "Austria" & pov$poverty < 15
pov$country != "Austria" & pov$poverty < 15
## [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
## [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [1] TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
## [1] TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
Variables categòriques binàries
Les variables categòriques binàries només poden adoptar dos valors. Es poden crear amb vectors de caràcter, factors o vectors lògics, tal com s’ha mostrat en els anteriors apartats.
Variables numèriques
Les variables numèriques, anomenades també cardinals o quantitatives, són variables que representen nombres en els seus valors. Hi ha dos tipus de variables numèriques:
- Les numèriques contínues accepten decimals.
- Les numèriques discretes no accepten decimals.
Font: Alison Horst.
Operacions: Amb les variables numèriques es poden fer les següents operacions.
Igual: ==
No igual: !=
Més gran o igual que: >=
Més petit o igual que; <=
Més gran que: >
Més petit que: <
Sumar: +
Restar: -
Multiplicar: *
Dividir: /
Logaritme: log()
Etc.
Per defecte, si una variable conté nombres ens crearà un vector numèric, també anomenat double. Per crear un vector enter ho podem fer de dues maneres diferents:
enter1 <- c(4L, 8L, 15L, 16L, 23L, 42L)
typeof(enter1)
## [1] "integer"
enter2 <- as.integer(c(4, 8, 15, 16, 23, 42))
typeof(enter2)
## [1] "integer"
A l’hora de fer operacions amb un vector numèric o enter, podem fer dues coses:
- Fer operacions d’un vector amb un nombre.
3 * c(1, 3, 6)
## [1] 3 9 18
- Fer operacions entre dos vectors d’igual longitud.
c(1, 3, 6) * c(1, 3, 6)
## [1] 1 9 36
- En canvi, en operacions amb vectors de diferent longitud ens donarà un avís.
c(1, 3, 6) * c(1, 3)
## Warning in c(1, 3, 6) * c(1, 3): longer object length is not a multiple of
## shorter object length
## [1] 1 9 6
Passar de numèric a categòric
Dues de les funcions més importants per pasar de variable numèrica a variable categòrica són if_else()
i case_when()
.
- Si volem transformar el vector numèric en una variable categòrica dictòmica utilitzarem
if_else()
. - Si volem transformar el vector numèric en una variable categòrica de més de dues categories, utilitzarem
case_when()
.
Són dues funcions del paquet dplyr, que haurem de carregar.
#recordeu que els paquets han d'estar prèviament instal·lats
library(dplyr)
if_else()
L’estructura de la funció if_else()
consta de tres arguments, separats per comes:
- Condició lògica. El resultat del primer argument ha de ser un vector lògic que separi els valors que són TRUE i els que són FALSE.
- Valor nou que prendran els que siguin TRUE.
- Valor nou que prendran els que siguin FALSE.
if_else(pov$poverty >= 10, 1, 0)
## [1] 0 0 1 0 0 0 0 1 1 0
if_else(between(pov$poverty, 5, 20), "Medium", "Other")
## [1] "Other" "Other" "Other" "Medium" "Other" "Other" "Other" "Other"
## [9] "Medium" "Medium"
case_when()
L’estructura de la funció case_when()
consta de mínim tres arguments, separats per comes:
- Condició lògica 1. Per tant, el resultat del primer argument ha de ser un vector lògic que separi els valors que són TRUE i els que són FALSE.
- Tots els TRUE ens els convertirà a la categoria que indiquem després del símbol ~.
- Condició lògica 2 i així successivament.
- Si volem indicar ‘la resta de valors’ ho farem amb un darrer argument on indiqui TRUE, seguit el símbol ~ i el valor que prendran la resta de valors.
pov$f_poverty <- case_when(pov$poverty < 2 ~ "Low",
between(pov$poverty, 2, 10) ~ "Medium",
TRUE ~ "High")
En el cas que, un cop categoritzada la variable, la vulguem fer ordinal:
pov$f_poverty <- factor(pov$f_poverty, order = TRUE,
levels = c("Low", "Medium", "High"))
Annex
Creem un vector enter i comprovem que és enter
enter <- c(1L, 1L, 2L, 3L, 3L, 4L)
typeof(enter)
## [1] "integer"
class(enter)
## [1] "integer"
El convertim a factor i veiem que segueix sent enter, però ara té la propietat factor i nivells associats.
enter <- as.factor(enter)
typeof(enter)
## [1] "integer"
enter
## [1] 1 1 2 3 3 4
## Levels: 1 2 3 4
Introduïm etiquetes per a cada nivell. Veiem que continua sent un vector enter, però cada nombre està associat amb una etiqueta.
levels(enter) <- c("Argentina", "Brazil", "Bolivia", "Colombia")
enter
## [1] Argentina Argentina Brazil Bolivia Bolivia Colombia
## Levels: Argentina Brazil Bolivia Colombia
attributes(enter)
## $levels
## [1] "Argentina" "Brazil" "Bolivia" "Colombia"
##
## $class
## [1] "factor"
Apliquem la mateixa idea a la creació d’una variable categòrica dicotòmica que distingeixi entre països que siguin potència nuclear i potència no nuclear.
nuclears <- c("Nuclear", "Nuclear", "No Nuclear", "Nuclear", "No Nuclear", "Nuclear")
typeof(nuclears)
## [1] "character"
class(nuclears)
## [1] "character"
factor_nuclears <- factor(nuclears)
typeof(factor_nuclears)
## [1] "integer"
class(factor_nuclears)
## [1] "factor"
factor_nuclears
## [1] Nuclear Nuclear No Nuclear Nuclear No Nuclear Nuclear
## Levels: No Nuclear Nuclear
attributes(factor_nuclears)
## $levels
## [1] "No Nuclear" "Nuclear"
##
## $class
## [1] "factor"
A l’annex il·lustrem el procés de creació d’un vector a partir de les propietats d’un vector enter↩︎