6.1 Vectores

Un vector es la estructura de datos más sencilla en R. Un vector es una colección de uno o más datos del mismo tipo.

Todos los vectores tienen tres propiedades:

  • Tipo. Un vector tiene el mismo tipo que los datos que contiene. Si tenemos un vector que contiene datos de tipo numérico, el vector será también de tipo numérico. Los vectores son atómicos, pues sólo pueden contener datos de un sólo tipo, no es posible mezclar datos de tipos diferentes dentro de ellos.
  • Largo. Es el número de elementos que contiene un vector. El largo es la única dimensión que tiene esta estructura de datos.
  • Atributos. Los vectores pueden tener metadatos de muchos tipos, los cuales describen características de los datos que contienen. Todos ellos son incluidos en esta propiedad. En este libro no se usarán vectores con metadatos, por ser una propiedad con usos van más allá del alcance de este libro.

Cuando una estructura únicamente puede contener datos de un sólo tipo, como es el caso de los vectores, decimos que es homogénea, pero no implica que necesariamente sea atómica. Regresaremos sobre esto al hablar de matrices y arrays.

Como los vectores son la estructura de datos más sencilla de R, datos simples como el número 3, son en realidad vectores. En este caso, un vector de tipo numérico y largo igual a 1.

3
## [1] 3

Verificamos que el 3 es un vector con la función is.vector().

is.vector(3)
## [1] TRUE

Y usamos la función length() para conocer su largo.

length(3)
## [1] 1

Lo mismo ocurre con los demás tipos de datos, por ejemplo, con cadenas de texto y datos lógicos.

is.vector("tres")
## [1] TRUE
is.vector(TRUE)
## [1] TRUE

6.1.1 Creación de vectores

Creamos vectores usando la función c() (combinar).

Llamamos esta función y le damos como argumento los elementos que deseamos combinar en un vector, separados por comas.

# Vector numérico
c(1, 2, 3, 5, 8, 13)
## [1]  1  2  3  5  8 13
# Vector de cadena de texto
c("arbol", "casa", "persona")
## [1] "arbol"   "casa"    "persona"
# Vector lógico
c(TRUE, TRUE, FALSE, FALSE, TRUE)
## [1]  TRUE  TRUE FALSE FALSE  TRUE

Si deseamos agregar un elemento a un vector ya existente, podemos hacerlo combinando nuestro vector original con los elementos nuevos y asignando el resultado a nuestro vector original.

mi_vector <- c(TRUE, FALSE, TRUE)

mi_vector <- c(mi_vector, FALSE)

mi_vector
## [1]  TRUE FALSE  TRUE FALSE

Naturalmente, podemos crear vectores que son combinación de vectores.

mi_vector_1 <- c(1, 3, 5)
mi_vector_2 <- c(2, 4, 6)

mi_vector_3 <- c(mi_vector_1, mi_vector_2)

mi_vector_3
## [1] 1 3 5 2 4 6

Si intentamos combinar datos de diferentes tipos en un mismo vector, R realizará coerción automáticamente. El vector resultante será del tipo más flexible entre los datos que contenga, siguiendo las reglas de coerción.

Creamos un vector numérico.

mi_vector <- c(1, 2, 3)

class(mi_vector)
## [1] "numeric"

Si intentamos agregar un dato de tipo cadena de texto, nuestro vector ahora será de tipo cadena de texto.

mi_vector_nuevo <- c(mi_vector, "a")

class(mi_vector_nuevo)
## [1] "character"

Como las cadenas de texto son el tipo de dato más flexible, siempre que creamos un vector que incluye un dato de este tipo, el resultado será un vector de texto.

mi_vector_mezcla <- c(FALSE, 2, "tercero", 4.00)

class(mi_vector_mezcla)
## [1] "character"

Podemos crear vectores de secuencias numéricas usando :. De un lado de los dos puntos escribimos el número de inicio de la secuencia y del otro el final.

Por ejemplo, creamos una secuencia del 1 al 10.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10

También podemos crear una secuencia del 10 al 1.

10:1
##  [1] 10  9  8  7  6  5  4  3  2  1

Las secuencias creadas con : son consecutivas con incrementos o decrementos de 1. Estas secuencias pueden empezar con cualquier número, incluso si este es negativo o tiene cifras decimales

# Número negativo
-43:-30
##  [1] -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -32 -31 -30
# Número con cifras decimales
67.23:75
## [1] 67.23 68.23 69.23 70.23 71.23 72.23 73.23 74.23

Si nuestro número de inicio tiene cifras decimales, estas serán respetadas al hacer los incrementos o decrementos de uno en uno. En contraste, si es nuestro número de final el que tiene cifras decimales, este será redondeado.

# Se conservan los decimales del inicio
-2.48:2
## [1] -2.48 -1.48 -0.48  0.52  1.52
56.007:50
## [1] 56.007 55.007 54.007 53.007 52.007 51.007 50.007
# Se redondean los decimales del final
166:170.05
## [1] 166 167 168 169 170
968:960.928
## [1] 968 967 966 965 964 963 962 961

6.1.2 Vectorización de operaciones

Existen algunas operaciones al aplicarlas a un vector, se aplican a cada uno de sus elementos. A este proceso le llamamos vectorización.

Las operaciones aritméticas y relacionales pueden vectorizarse. Si las aplicamos a un vector, la operación se realizará para cada uno de los elementos que contiene.

Por ejemplo, creamos un vector numérico.

mi_vector <- c(2, 3, 6, 7, 8, 10, 11)

Si aplicamos operaciones aritméticas, obtenemos un vector con un resultado por cada elemento.

# Operaciones aritméticas
mi_vector + 2
## [1]  4  5  8  9 10 12 13
mi_vector * 2
## [1]  4  6 12 14 16 20 22
mi_vector %% 2
## [1] 0 1 0 1 0 0 1

Al aplicar operaciones relacionales, obtenemos un vector de TRUEy FALSE, uno para cada elemento comparado.

mi_vector > 7
## [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
mi_vector < 7
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
mi_vector == 7
## [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

Esta manera de aplicar una operación es muy eficiente. Comparada con otros procedimientos, requiere de menos tiempo de cómputo, lo cual a veces es considerable, en particular cuando trabajamos con un número grande de datos.

Aunque el nombre de este proceso es vectorización, también funciona, en ciertas circunstancias, para otras estructuras de datos.