4 Tipos de variables

En R existen varios tipos de objectos que permiten que el usuario pueda almacenar la información para realizar procedimientos estadísticos y gráficos. Los principales objetos en R son vectores, matrices, arreglos, marcos de datos y listas. A continuación se presentan las características de estos objetos y la forma para crearlos.

4.1 Variables

Las variables sirven para almacenar un valor en el enviroment que luego vamos a utilizar en algún procedimiento.

Para hacer la asignación de un valor a alguna variable se utiliza el operador <- entre el valor y el nombre de la variable. A continuación un ejemplo sencillo.

x <- 5
2 * x + 3
## [1] 13

En el siguiente ejemplo se crea la variable pais y se almacena el nombre Colombia, luego se averigua el número de caracteres de la variable pais.

pais <- "Colombia"
nchar(pais)
## [1] 8

4.1.1 NULL y NA

La expresión NA se usa en R para indicar un valor faltante. Considere el siguiente ejemplo. Recomendaciones, las funciones nativas de R, siempre es preferible no usarlas como nombres de variables en el ambiente de trabajo.

vec <- c(3, NA, 5)
vec
## [1]  3 NA  5

4.2 Vectores

Los vectores vectores son arreglos ordenados en los cuales se puede almacenar información de tipo numérico (variable cuantitativa), alfanumérico (variable cualitativa) o lógico (TRUE o FALSE), pero no mezclas de éstos.
La función de R para crear un vector es c() y que significa concatenar; dentro de los paréntesis de esta función se ubica la información a almacenar. Una vez construído el vector se acostumbra a etiquetarlo con un nombre corto y representativo de la información que almacena, la asignación se hace por medio del operador <- entre el nombre y el vector.

A continuación se presenta un ejemplo de cómo crear tres vectores que contienen las respuestas de cinco personas a tres preguntas que se les realizaron.

edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')

El vector edad es un vector cuantitativo y contiene las edades de las 5 personas. En la cuarta posición del vector se colocó el símbolo NA que significa Not Available debido a que no se registró la edad para esa persona. Al hacer una asignación se acostumbra a dejar un espacio antes y después del operador <- de asignación.

El segundo vector es llamado deporte y es un vector lógico que almacena las respuestas a la pregunta de si la persona practica deporte, nuevamente aquí hay un NA para la tercera persona.

El último vector comic_fav contiene la información del cómic favorito de cada persona, como esta variable es cualitativa es necesario usar las comillas ' ' para encerrar las respuestas.

Cuando se usa NA para representar una información Not Available no se deben usar comillas.
Es posible usar comillas sencillas 'foo' o comillas dobles "foo" para ingresar valores de una variable cualitativa.

Si se desea ver lo que está almacenado en cada uno de estos vectores, se debe escribir en la consola de R el nombre de uno de los objetos y luego se presionar CTRL + ENTER, al realizar esto, permite correr todo el chunk a continuación.

edad
## [1] 15 19 13 NA 20
deporte
## [1]  TRUE  TRUE    NA FALSE  TRUE
comic_fav
## [1] NA         "Superman" "Batman"   NA         "Batman"
Una variable es un vector de longitud uno.

4.2.1 ¿Cómo extraer elementos de un vector?

Para extraer un elemento almacenado dentro un vector se usan los corchetes [] y dentro de ellos la posición o posiciones que interesan.

Ejemplo

Si se quiere extraer la edad de la tercera persona escribimos el nombre del vector y luego [3] para indicar la tercera posición de edad, a continuación el código.

edad[3]
## [1] 13

Si se quiere conocer el cómic favorito de la segunda y quinta persona, escribimos el nombre del vector y luego, dentro de los corchetes, escribimos otro vector con las posiciones 2 y 5 que nos interesan así [c(2, 5)], a continuación el código.

comic_fav[c(2, 5)]
## [1] "Superman" "Batman"

Si nos interesan las respuestas de la práctica de deporte, excepto la de la persona 3, usamos [-3] luego del nombre del vector para obtener todo, excepto la tercera posición.

deporte[-3]
## [1]  TRUE  TRUE FALSE  TRUE
Si se desea extraer varios posiciones de un vector, NUNCA se escribe esto: mivector[2, 5, 7]. Tiene que crear un vector con las posiciones y luego colocarlo dentro de los corchetes así: mivector[c(2, 5, 7)]

4.3 Matrices

Las matrices son arreglos rectangulares de filas y columnas con información numérica, alfanumérica o lógica. Para construir una matriz se usa la función matrix( ). Por ejemplo, para crear una matriz de 4 filas y 5 columnas (de dimensión \(4 \times 5\)) con los primeros 20 números positivos se escribe el código siguiente en la consola.

mimatriz <- matrix(data = 1:20, nrow = 4, ncol = 5, byrow = FALSE)

El argumento data de la función sirve para indicar los datos que se van a almacenar en la matriz, los argumentos nrow y ncol sirven para definir la dimensión de la matriz y por último el argumento byrow sirve para indicar si la información contenida en data se debe ingresar por filas o no.

mimatriz
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

4.3.1 ¿Cómo extraer elementos de una matriz?

Al igual que en el caso de los vectores, para extraer elementos almacenados dentro de una matriz se usan los corchetes [ , ] y dentro, separado por una coma, el número de fila(s) y el número de columna(s) que nos interesan.

Ejemplo

Si se quiere extraer el valor almacenado en la fila 3 y columna 4 usamos el siguiente código.

mimatriz[3, 4]
## [1] 15

Si se quiere recuperar toda la fila 2 se usa el siguiente código.

mimatriz[2, ]  # No se escribe nada luego de la coma
## [1]  2  6 10 14 18

Si se quiere recuperar toda la columna 5 usamos el siguiente código.

mimatriz[, 5]  # No se escribe nada antes de la coma
## [1] 17 18 19 20

Si se quiere recuperar la matriz original sin las columnas 2 y 4 usamos el siguiente código.

mimatriz[, -c(2, 4)]  # Las columnas como vector
##      [,1] [,2] [,3]
## [1,]    1    9   17
## [2,]    2   10   18
## [3,]    3   11   19
## [4,]    4   12   20

Si se quiere recuperar la matriz original sin la fila 1 ni columna 3 usamos el siguiente código.

mimatriz[-1, -3]  # Signo de menos para eliminar
##      [,1] [,2] [,3] [,4]
## [1,]    2    6   14   18
## [2,]    3    7   15   19
## [3,]    4    8   16   20

4.4 Arreglos

Un arreglo es una matriz de varias dimensiones con información numérica, alfanumérica o lógica. Para construir una arreglo se usa la función array( ). Por ejemplo, para crear un arreglo de \(3 \times 4 \times 2\) con las primeras 24 letras minúsculas del alfabeto se escribe el siguiente código.

miarray <- array(data = letters[1:24], dim = c(3, 4, 2))

El argumento data de la función sirve para indicar los datos que se van a almacenar en el arreglo y el argumento dim sirve para indicar las dimensiones del arreglo. Para observar lo que quedó almacenado en el objeto miarray se escribe en la consola lo siguiente.

miarray
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,] "a"  "d"  "g"  "j" 
## [2,] "b"  "e"  "h"  "k" 
## [3,] "c"  "f"  "i"  "l" 
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,] "m"  "p"  "s"  "v" 
## [2,] "n"  "q"  "t"  "w" 
## [3,] "o"  "r"  "u"  "x"

4.4.1 ¿Cómo extraer elementos de un arreglo?

Para recuperar elementos almacenados en un arreglo se usan también corchetes, y dentro de los corchetes, las coordenadas del objeto de interés.

Ejemplo

Si se quiere extraer la letra almacenada en la fila 1 y columna 3 de la segunda capa de miarray se usa el siguiente código.

miarray[1, 3, 2]  # El orden es importante
## [1] "s"

Si se quiere extraer la segunda capa completa usamos el siguiente código.

miarray[,, 2]  # No se coloca nada en las primeras posiciones
##      [,1] [,2] [,3] [,4]
## [1,] "m"  "p"  "s"  "v" 
## [2,] "n"  "q"  "t"  "w" 
## [3,] "o"  "r"  "u"  "x"

Si se quiere extraer la tercera columna de todas las capas usamos el siguiente código.

miarray[, 3,]  # No se coloca nada en las primeras posiciones
##      [,1] [,2]
## [1,] "g"  "s" 
## [2,] "h"  "t" 
## [3,] "i"  "u"

4.5 Data Frame

El data frame_ o marco de datos es uno de los objetos más utilizados porque permite agrupar vectores con información de diferente tipo (numérica, alfanumérica o lógica) en un mismo objeto, la única restricción es que los vectores deben tener la misma longitud. Para crear un marco de datos se usa la función data.frame( ), como ejemplo, se va a crear un marco de datos con los vectores edad, deporte y comic_fav definidos anteriormente.

mimarco <- data.frame(edad, deporte, comic_fav)

Una vez creado el objeto mimarco se puede ver el objeto escribiendo su nombre en la consola, a continuación se muestra lo que se obtiene.

mimarco
##   edad deporte comic_fav
## 1   15    TRUE      <NA>
## 2   19    TRUE  Superman
## 3   13      NA    Batman
## 4   NA   FALSE      <NA>
## 5   20    TRUE    Batman

De la salida anterior se ve que el marco de datos tiene 3 variables (columnas) cuyos nombres coinciden con los nombres de los vectores creados anteriormente, los números consecutivos al lado izquierdo son sólo de referencia y permiten identificar la información para cada persona en la base de datos.

4.5.1 ¿Cómo extraer elementos de un marco de datos?

Para recuperar las variables (columnas) almacenadas en un marco de datos se puede usar el operador $, corchetes simples [] o corchetes dobles [[]]. A continuación algunos ejemplos para entender las diferencias entre estas opciones.

Ejemplo

Si se quiere extraer la variable deporte del marco de datos mimarco como un vector usamos el siguiente código.

mimarco$deporte  # Se recomienda si el nombre es corto
## [1]  TRUE  TRUE    NA FALSE  TRUE

Otra forma de recuperar la variable deporte como vector es indicando el número de la columna donde se encuentra la variable.

mimarco[, 2]  # Se recomienda si recordamos su ubicacion
## [1]  TRUE  TRUE    NA FALSE  TRUE

Otra forma de extraer la variable deporte como vector es usando [[]] y dentro el nombre de la variable.

mimarco[["deporte"]]
## [1]  TRUE  TRUE    NA FALSE  TRUE

Si usamos mimarco["deporte"] el resultado es la variable deporte pero en forma de marco de datos, no en forma vectorial.

mimarco["deporte"]
##   deporte
## 1    TRUE
## 2    TRUE
## 3      NA
## 4   FALSE
## 5    TRUE

Si se quiere extraer un marco de datos sólo con las variables deporte y edad se puede usar el siguiente código.

mimarco[c("deporte", "edad")]
##   deporte edad
## 1    TRUE   15
## 2    TRUE   19
## 3      NA   13
## 4   FALSE   NA
## 5    TRUE   20

mimarco[,c(2,1)]
##   deporte edad
## 1    TRUE   15
## 2    TRUE   19
## 3      NA   13
## 4   FALSE   NA
## 5    TRUE   20

Por otra, si se quiere la edad de las personas que están en las posiciones 2 hasta 4 usamos el siguiente código.

mimarco[2:4, 1]
## [1] 19 13 NA

4.5.2 ¿Cómo extraer subconjuntos de un data.frame?

Para extraer partes de un marco de datos se puede utilizar la función subset(x, subset, select). El parámetro x sirve para indicar el marco de datos original, el parámetro subset sirve para colocar la condición y el parámetro select sirve para quedarnos sólo con algunas de las variables del marco de datos. A continuación varios ejemplos de la función subset para ver su utilidad.

Ejemplos

Si se quiere que el marco de datos mimarco sólo con las personas que SI practican deporte usamos el siguiente código.

subset(mimarco, subset = deporte == TRUE)
##   edad deporte comic_fav
## 1   15    TRUE      <NA>
## 2   19    TRUE  Superman
## 5   20    TRUE    Batman

Si se quiere el marco de datos mimarco sólo con las personas mayores o iguales a 17 años usamos el siguiente código.

subset(mimarco, subset = edad >= 17)
##   edad deporte comic_fav
## 2   19    TRUE  Superman
## 5   20    TRUE    Batman

Si se quiere el submarco con deporte y comic de las personas menores de 20 años usamos el siguiente código.

subset(mimarco, subset = edad < 20, select = c('deporte', 'comic_fav'))
##   deporte comic_fav
## 1    TRUE      <NA>
## 2    TRUE  Superman
## 3      NA    Batman

Si se quiere el marco de datos mimarco sólo con las personas menores de 20 años y que SI practican deporte usamos el siguiente código.

subset(mimarco, subset = edad < 20 & deporte == TRUE)
##   edad deporte comic_fav
## 1   15    TRUE      <NA>
## 2   19    TRUE  Superman

4.5.3 Información sobre objetos

Aquí hay una lista de funciones que a menudo son útiles para obtener información sobre objetos en R.

  • length devuelve el número de entradas en un vector.

  • dim devuelve el número de filas y columnas de una matriz o un marco de datos

  • unique devuelve los elementos únicos de un vector o las filas únicas de una matriz o un marco de datos.

  • head devuelve las primeras entradas de un vector o las primeras filas de una matriz o un marco de datos

  • order devuelve una reordenación de un vector o un data.frame en orden ascendente.

vec <- c(4,2,7,5,5)

length(vec)
## [1] 5

unique(vec)
## [1] 4 2 7 5

order(vec)
## [1] 2 1 4 5 3

Ejemplo

Leer la base de datos medidas del cuerpo disponible en este enlace https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo. Extraer de esta base de datos una sub-base o subconjunto que contenga sólo la edad, peso, altura y sexo de aquellos que miden más de 185 cm y pesan más de 80 kg.

url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo'

dt1 <- read.table(url, header = T)

dim(dt1)  # Para conocer la dimensión de la base original 
## [1] 36  6

dt2 <- subset(x = dt1, subset = altura > 185 & peso > 80,
               select = c('sexo', 'edad', 'peso', 'altura'))
dt2  # Para mostrar la base de datos final
##      sexo edad peso altura
## 1  Hombre   43 87.3  188.0
## 6  Hombre   33 85.9  188.0
## 15 Hombre   30 98.2  190.5

Al almacenar la nueva base de datos en el objeto dt2 se puede manipular este nuevo objeto para realizar los análisis de interés.

4.6 Listas

Las listas son otro tipo de objeto muy usado para almacenar objetos de diferente tipo. La instrucción para crear una lista es list( ). A continuación vamos a crear una lista que contiene tres objetos:
- un vector con 5 números aleatorios llamado mivector,
-una matriz de dimensión \(6 \times 2\) con los primeros doce números enteros positivos llamada matriz2 y, - el tercer objeto será el marco de datos mimarco creado en el apartado anterior.

Las instrucciones para crear la lista requerida se muestran a continuación.

set.seed(12345)
mivector <- runif(n = 5) 

matriz2 <- matrix(data = 1:12, ncol = 6) 

milista <- list(E1 = mivector, E2 = matriz2, E3 = mimarco)

La función set.seed de la línea número 1 sirve para fijar la semilla de tal manera que los números aleatorios generados en la segunda línea con la función runif sean siempre los mismos. En la última línea del código anterior se construye la lista, dentro de la función list se colocan los tres objetos mivector, matriz2 y mimarco. Es posible colocarle un nombre especial a cada uno de los elementos de la lista, en este ejemplo se colocaron los nombres E1, E2 y E3 para cada uno de los tres elementos. Para observar lo que quedó almacenado en la lista se escribe milista en la consola y el resultado se muestra a continuación.

milista
## $E1
## [1] 0.7209039 0.8757732 0.7609823 0.8861246 0.4564810
## 
## $E2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12
## 
## $E3
##   edad deporte comic_fav
## 1   15    TRUE      <NA>
## 2   19    TRUE  Superman
## 3   13      NA    Batman
## 4   NA   FALSE      <NA>
## 5   20    TRUE    Batman

4.6.1 ¿Cómo extraer elementos de una lista?

Para recuperar los elementos almacenadas en una lista se usa el operador $, corchetes dobles [[]] o corchetes sencillos []. A continuación unos ejemplos para entender cómo extraer elementos de una lista.

Ejemplos

Si se quiere la matriz almacenada con el nombre de E2 dentro del objeto milista se puede usar el siguiente código.

milista$E2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12

Es posible indicar la posición del objeto en lugar del nombre, para eso se usan los corchetes dobles.

milista[[2]]
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12

El resultado obtenido con milista$E2 y milista[[2]] es exactamente el mismo. Vamos se va a solicitar la posición 2 pero usando corchetes sencillos.

milista[2]
## $E2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12

La apariencia de este último resultado es similar, no igual, al encontrado al usar $ y [[]]. Para ver la diferencia vamos a pedir la clase a la que pertenecen los tres últimos objetos usando la función class. A continuación el código usado.

class(milista$E2)
## [1] "matrix" "array"

class(milista[[2]])
## [1] "matrix" "array"

class(milista[2])
## [1] "list"

De lo anterior se observa claramente que cuando usamos $ o [[]] el resultado es el objeto almacenado, una matriz. Cuando usamos [] el resultado es una lista cuyo contenido es el objeto almacendado.

Al manipular listas con $ y [[]] se obtienen los objetos ahí almacenados, al manipular listas con [] se obtiene una lista.

¿Cuál es el error al correr el siguiente código? ¿A qué se debe?

edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
matrix(edad, deporte, comic_fav)