Variables y tipos

Una variable es una característica del fenómeno que estudiamos que varía entre los casos y, por lo tanto, puede tomar varios valores. Tenemos cuatro tipos de variables:

Variables categóricas

Tenemos principalmente tres tipos de variables categóricas: nominales, ordinales y binarias. Cualquier de estos tres tipos se puede almacenar a R como vectores de carácter, factor o vectores lógicos. La manera como lo almacenamos dependerá de la utilidad que le queramos dar:

Fuente: Alison Horst.

Variables categoricas nominales

Las variables categoricas nominales se pueden almacenar en R como vectores de carácter, como factores o como vectores lógicos.

Operaciones: Con las variables categoricas nominales se pueden hacer las siguientes operaciones de igualdad.
Igual: ==
No igual: !=

Caracteres

Los vectores de carácter o strings almacenan todo tipo de caracteres, desde letras hasta símbolos especiales. Siempre utilizaremos las comillas para referirnos a cada valor. Creamos un vector de carácter de la siguiente manera:

vector_caracter <- c("Kuwait", "Qatar", "Saudi Arabia", "Bahrain")

Para poder modificar fácilmente los vectores de carácter, uno de los paquetes con más posibilidades es el paquete stringr.

Factores

Un factor es un vector entero que almacena información categórica. Normalmente crearemos los factores a partir de un vector de carácter y lo pasaremos como factor con la función factor()1 de la siguiente manera:

paises <- factor(c("BRA", "ARG", "VEN", "URU", "PAR")) #creamos un vector de carácter
paises #observamos el vector
levels(paises) #observamos los niveles

A continuación observamos como modificar los niveles de un factor:

#podemos modificar los niveles de la siguiente manera:
levels(paises) <- c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela") 
paises #comprobamos los resultados

#también podemos modificar un solo nivel
levels (paisos)[4] <- c("URUGUAY") 
paisos #comprovamos los resultados

#lo podemos modificar los niveles a través de un argumento en la función factor
factor(paisos, labels = c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela"))

Para manipular factores es muy útil el paquete forcats.

Lógicos

En un vector lógico la variable solo puede tener dos valores discretos y normalmente no ordenables: verdadero (TRUE) y falso (FALSE). En este caso se tratará de una variable binaria (también llamada dicotómica, booleana o dummy), que normalmente sirve para indicar la presencia o ausencia de un determinado concepto. Si el concepto está presente, la variable toma el valor lógico TRUE, si el concepto es ausente, toma el valor lógico FALSE. Crearemos un vector lógico de la siguiente manera:

vector_logico <- c(TRUE, FALSE, FALSE, TRUE)

Variables categoricas ordinales

Las variables ordinales son variables categóricas que se pueden ordenar de manera lógica. También las podemos almacenar como vectores de carácter, factores o vectores lógicos, a pesar de algunas pequeñas diferencias en relación a los factores y los vectores lógicos.

Operaciones: Con las variables categóricas ordinales se pueden hacer las siguientes operaciones de igualdad.
Igual: ==
No igual: !=
Más grande o igual que: >=
Más pequeño o igual que: <=
Más grande que: >
Más pequeño que: <

Factores

Los factores son una de las herramientas principales que tenemos para almacenar variables categóricas. Su gran potencial es la forma en que pueden guardar variables ordinales, ya que tienen la capacidad de ordenar las categorías siguiendo el orden que se indica. Fijaros en el marco de datos que creamos, donde tenemos una variable categórica ordinal. Una vez creado, imprimimos el marco de datos tecleando 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)
countryincome
Antigua and Barbudahigh
Belizeupper-middle
Costa Ricaupper-middle
Dominicaupper-middle
Dominican Republicupper-middle
El Salvadorlower-middle
Guyanaupper-middle
Guatemalaupper-middle
Haitilow
Honduraslower-middle
Jamaicaupper-middle
Nicaragualower-middle
Panamahigh
Surinamupper-middle
Trinidad and Tobagohigh

Fijaos en el procedimiento para convertir un factor en ordinal:

  • Dentro de la función factor(), indicamos que el argumento order a TRUE.
  • Indicamos al argumento levels el orden de los factores, de menor a mayor.
wb$income <- factor(wb$income, order = TRUE,
                    levels = c("low", "lower-middle", "upper-middle", "high"))

Comprobamos el resultado con:

class(wb$income)
wb$income

Vectores lógicos

Los vectores lógicos también pueden operar como una variable categórica ordinal per el simple hecho de que TRUE es convertible a 1 y FALSE es convertible a 0. Fijaos qué pasa si convertimos un vector lógico a vector numérico.

as.numeric(c(TRUE, FALSE))
## [1] 1 0

Eso significa que TRUE puede ser interpretado como un 1 y FALSE como un 0. Para ilustrarlo vamos a crear un marco de datos formado por dos vectores, country y poverty. Primero creamos los vectores y, a partir de los vectores, creamos el marco de datos.

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)

Observad como cualquier vector es convertible en un vector lógico. Observad los siguientes ejemplos:

pov$country == "Benin" #preguntamos si algun elemento del vector country lleva el nombre Benin
##  [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
pov$poverty < 16 #preguntamos si algún elemento del vector *poverty* es inferior a 16
##  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE

Para pasar cualquier tipus de vector a vector lógico tendremos que dominar los operadores relacionales. Este vídeo resume los distintos operadores que hemos visto hasta ahora:

Fuente: Datacamp

Para combinar distintos resultados lógicos es esencial que comprendáis cómo funcionan los operadores booleanos:

  • AND: Utilizaremos el símbolo &
  • OR: Utilizaremos el símbolo |
  • NOT: Utilizaremos el símbolo !=

El siguiente vídeo os lo explica.

Fuente: Datacamp

Veamos algunos ejemplos de cómo funcionan los operadores booleanos:

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óricas binarias

Las variables categóricas binarias solamente pueden adoptar dos valores. Se pueden crear con vectores de carácter, factores o vectores lógicos, tal como se ha mostrado en los anteriores apartados.

Variables numericas

Las variables numéricas, llamadas también cardinales o cuantitativas, son variables que representan números en sus valores.Hay dos tipos de variables numéricas:

  • Las numéricas continuas aceptan decimales.
  • Las numéricas discretas no aceptan decimales.

Font: Alison Horst.

Operaciones: Con las variables numéricas se pueden hacer las siguientes operaciones.
Igual: ==
No igual: !=
Más grande o igual que: >=
Más pequeño o igual que; <=
Más grande que: >
Más pequeño que: <
Sumar: +
Restar: -
Multiplicar: *
Dividir: /
Logaritmo: log()
Etc.

Por defecto, si una variable contiene números nos creará un vector numérico, también llamado double. Para crear un vector entero lo podemos hacer de dos maneras diferentes:

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"

Es importante tener en cuenta que a la hora de realizar operaciones con un vector numérico, podemos hacer dos cosas:

  • Realizar operaciones de un vector con un número.
3 * c(1, 3, 6)
## [1]  3  9 18
  • Realizar operaciones entre dos vectores de igual longitud.
c(1, 3, 6) * c(1, 3, 6)
## [1]  1  9 36
  • En cambio, en operaciones con vectores de diferente longitud nos dará un aviso.
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

Pasar de numérico a categórico

Dos de las funciones más importantes para pasar de variable numérica a variable categórica son if_else() y case_when().

  • Si queremos transformar el vector numérico en una variable categórica dictómica utilizaremos if_else().
  • Si queremos transformar el vector numérico en una variable categórica con más de dos categorías, utilizaremos case_when().

Son dos funciones del paquete dplyr, que tendremos que cargar.

## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

if_else()

La estructura de la función if_else() consta de tres argumentos, separados por comas:

  1. Condición lógica. El resultado del primer argumento debe ser un vector lógico que separe los valores que son TRUE y los que son FALSE.
  2. Valor nuevo que tomarán los TRUE.
  3. Valor nuevo que tomarán los 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()

La estructura de la función case_when() consta de mínimo tres argumentos, separados por comas:

  • Condición lógica 1. El resultado del primer argumento debe ser un vector lógico que separe los valores que son TRUE y los que son FALSE.
  • Todos los TRUE nos los convertirá en la categoría que indicamos después del símbolo ~.
  • Condición lógica 2 y así sucesivamente.
  • Si queremos indicar ‘el resto de valores’ lo haremos con un último argumento donde indique TRUE, seguido el símbolo ~ y el valor que tomarán el resto de valores.
pov$f_poverty <- case_when(pov$poverty < 2 ~ "Low", 
                           between(pov$poverty, 2, 10) ~ "Medium", 
                           TRUE ~ "High")

En caso de que, una vez categorizada la variable, la queramos hacer ordinal:

pov$f_poverty <- factor(pov$f_poverty, order = TRUE, 
                        levels = c("Low", "Medium", "High"))

Anexo

Creamos un vector entero y comprobamos que es entero.

entero <- c(1L, 1L, 2L, 3L, 3L, 4L)
typeof(entero)
## [1] "integer"
class(entero)
## [1] "integer"

Lo convertimos en factor y vemos que sigue siendo entero, pero ahora tiene la propiedad factor y niveles asociados.

entero <- as.factor(entero)
typeof(entero)
## [1] "integer"
entero
## [1] 1 1 2 3 3 4
## Levels: 1 2 3 4

Introducimos etiquetas para cada nivel. Sigue siendo un vector entero, pero cada número está asociado con una etiqueta.

levels(entero) <- c("Argentina", "Brazil", "Bolivia", "Colombia") 
entero
## [1] Argentina Argentina Brazil    Bolivia   Bolivia   Colombia 
## Levels: Argentina Brazil Bolivia Colombia
attributes(entero)
## $levels
## [1] "Argentina" "Brazil"    "Bolivia"   "Colombia" 
## 
## $class
## [1] "factor"

Aplicamos la misma idea a la creación de una variable categórica dicotómica que distinga entre países que sean potencia nuclear y potencia no nuclear.

nuclear <- c("Nuclear", "Nuclear", "No Nuclear", "Nuclear", "No Nuclear", "Nuclear") 
typeof(nuclear)
## [1] "character"
class(nuclear)
## [1] "character"
factor_nuclear <- factor(nuclear)
typeof(factor_nuclear)
## [1] "integer"
class(factor_nuclear)
## [1] "factor"
factor_nuclear
## [1] Nuclear    Nuclear    No Nuclear Nuclear    No Nuclear Nuclear   
## Levels: No Nuclear Nuclear
attributes(factor_nuclear)
## $levels
## [1] "No Nuclear" "Nuclear"   
## 
## $class
## [1] "factor"

  1. En el anexo ilustramos el proceso de creación de un vextor a partir de las propiedades de un vector entero↩︎

Previous