Estructuras de datos en R: Vectores


Rosa Molina

Esta entrada es parte de la serie de "Estructuras de datos en R" y está dedicada a los vectores. Veremos cómo definir vectores, junto con algunos trucos y herramientas para hacerlo. Revisaremos cómo acceder y cómo editar los elementos de un vector. Al final hablaremos de operaciones y funciones que actúan sobre vectores.

Si estás familiarizado con los vectores, aprenderás técnicas geniales para manipularlos. Por otro lado, si apenas vas empezando, no te preocupes, empezaremos desde el principio.


ADVERTISEMENT



Los vectores en R son estructuras de datos, lo que significa que son una forma organizada de almacenar información. Básicamente, un conjunto de datos.

Los vectores se definen con la función c(), que significa "combine".

Importante
Un vector sólo puede almacenar datos de un mismo tipo.

#Este es un vector de tipo numérico, pues sus elementos son todos numéricos
c(1,2,3,4,5,6,7,8,9)

#Este es un vector de tipo carácter, pues sus elementos son todos de ese tipo
c("azul", "verde", "rojo", "amarillo")

#Este es un vector de tipo lógico, pues sus elementos son todos de ese tipo
c(TRUE, FALSE, FALSE, TRUE)

#Si intentamos definir un vector con varios tipos de datos...
ejemplo <- c(1, "azul", TRUE)
ejemplo
[1] "1"  "azul"  "TRUE"

Si intentamos definir un vector que contenga varios tipos de datos, el tipo de dato más complejo "ganará", y los demás se convertirán en ese tipo. En el ejemplo anterior, el elemento numérico y el elemento lógico se convirtieron en caracteres para que el vector pudiera ser sólo de un mismo tipo.

Dicho esto, un vector, sea del tipo que sea, puede contener datos faltantes (los llamados "missing data"). Los datos faltantes en R se representan con el acrónimo NA, que significa "not available". Veamos cómo:

numerico <- c(1,2,3,4,NA)
caracter <- c("azul", NA, "rojo", "amarillo")
logico <- c(NA, FALSE, FALSE, TRUE)

numerico
caracter
logico
[1] 1  2  3  4  NA
[1] "azul"  NA  "rojo"  "amarillo"
[1] NA  FALSE  FALSE  TRUE

En R, está la opción de nombrar los elementos de un vector. Se hace dentro de la función c(), colocando el nombre que quieres usar, seguido de un signo "=", y después el valor del elemento. Por ejemplo:

experimento <- c(muestra1 = 1.4, muestra2 = 1.9, muestra3 = 1.1)

En este caso, nuestro vector (llamado "experimento") contiene tres valores numéricos, pero éstos tienen nombre ("muestra1", "muestra2", y "muestra3").

Más abajo, dentro de esta misma entrada, veremos cómo nos puede beneficiar que los elementos de nuestro vector tengan nombres. Sigamos con algunos trucos a la hora de definir vectores.

Herramientas para definir vectores

Si se trata de vectores numéricos, donde los elementos son números consecutivos, puedes usar el operador ":" para ahorrarte algo de trabajo, de esta manera:

c(1:15)

El vector anterior tendrá quince elementos, los números del 1 al 15.

Si en vez de números consecutivos necesitas números cada cierto incremento, la función seq() es la solución. Se usa así:

#Si queremos valores de 10 en 10, desde el 0 y hasta el 100
ejemplo1 <- seq(from = 0, to = 100, by = 10)

#Si queremos valores de 0.2 en 0.2, desde el -1 y hasta el 1
ejemplo2 <- seq(from = -1, to = 1, by = 0.2)

ejemplo1
ejemplo2
[1] 0  10  20  30  40  50  60  70  80  90  100
[1] -1.0  -0.8  -0.6  -0.4  -0.2  0.0  0.2  0.4  0.6  0.8  1.0

Por último, si lo que quieres es un conjunto de valores, repetidos cierto número de veces, la función rep() es la que estás buscando:

#El primer argumento de la función rep() es el conjunto de valores, el segundo es el número de repeticiones
ejemplo3 <- rep(c(1,2,3), times = 2)

#El argumento "times" también puede ser un vector que indique cuántas veces se repite cada elemento
ejemplo4 <- rep(c(1,2,3), times = c(3,2,1))

#En este caso el segundo argumento es cuántas veces se repite cada elemento
ejemplo5 <- rep(c(1,2,3), each = 2)

#Por último, con todos los argumentos:
ejemplo6 <- rep(c(1,2,3), times = 2, each = 3)

ejemplo3
ejemplo4
ejemplo5
ejemplo6
[1] 1  2  3  1  2  3
[1] 1  1  1  2  2  3
[1] 1  1  2  2  3  3
[1] 1  1  1  2  2  2  3  3  3  1  1  1  2  2  2  3  3  3

La función rep() puede ser utilizada para conjuntos de valores lógicos y caracteres también, no sólo numéricos.

Accediendo a los elementos de un vector

Cuando queremos saber cuál es el valor de un elemento en concreto, usamos algo llamado "indexación" ("indexing"). Los elementos de un vector están numerados, comenzando con el número 1. Podemos acceder a ellos escribiendo entre corchetes:

#Vamos a acceder al primer elemento del vector que definimos anteriormente
ejemplo1[1]

#Ahora accedamos al elemento 10 de nuestro vector
ejemplo1[10]
[1] 0
[1] 90

¿Qué crees que suceda si accedemos al elemento [0] de un vector?

ejemplo1[0]
numeric(0)

En el espacio del elemento [0], R guarda el tipo de vector (numérico, lógico, etc.)

También puedes acceder a todos los elementos menos alguno en específico, usando un número negativo ente los corchetes.

#Vamos a acceder a todos los elementos del vector, excepto el segundo
ejemplo1[-2]
[1] 0  20  30  40  50  60  70  80  90  100

Incluso podemos especificar exactamente las posiciones a las que queremos acceder (o las que no), usando un vector dentro de los corchetes. Por ejemplo:

#Accedamos al primer, tercer y quinto elemento
ejemplo1[c(1,3,5)]

#Accedamos a todos los elementos menos el primero, tercero y quinto
ejemplo1[c(-1,-3,-5)]
[1] 0  20  40
[1] 10  30  50  60  70  80  90  100

Cuando tienes un vector con nombres (como nuestro vector "experimento"), puedes acceder a los elementos por su nombre, dentro de los corchetes, así:

#Accedamos al elemento llamado "muestra2"
experimento["muestra2"]

#Accedamos ahora a la "muestra2" y la "muestra3"
experimento[c("muestra2", "muestra3")]
[1] 1.9
[1] 1.9  1.1

Filtrado de elementos de un vector

Puedes filtrar a un vector usando algunos operadores de R. Si la condición entre los corchetes es verdadera el valor será filtrado. Veamos ejemplos con los vectores que hemos definido hasta ahora:

#Si queremos solamente los números divisibles entre 3 de un vector
ejemplo1[ejemplo1 %% 3 == 0]

#Si queremos los números menores a 0
ejemplo2[ejemplo2 < 0]

#Si queremos los valores NA
numerico[is.na(numerico)]

#Si queremos todos los valores excepto los NA
numerico[!is.na(numerico)]
[1] 0  30  60  90
[1] -1.0  -0.8  -0.6  -0.4  -0.2
[1] NA
[1] 1  2  3  4

Edición de vectores

Si quieres añadir un elemento nuevo a un vector existente, puedes hacerlo dentro de la función c():

#Añadir un elemento al principio de un vector
caracter <- c("naranja", caracter)

#Añadir un elemento al final de un vector
numerico <- c(numerico, 6)

caracter
numerico
[1] "naranja"  "azul"  NA  "rojo"  "amarillo"
[1] 1  2  3  4  NA  6

También puedes usar la técnica de indexación para editar uno o varios elementos a la vez, de la siguiente forma:

#Editar el primer elemento
caracter[1] <- "morado"

#Editar todos los elementos menos el primero
ejemplo1[-1] <- 100

#Editar todos los elementos menores a 0
ejemplo2[ejemplo2 < 0] <- 0

caracter
ejemplo1
ejemplo2
[1] "morado"  "azul"  NA  "rojo"  "amarillo"
[1] 0  100  100  100  100  100  100  100  100  100  100
[1] 0.0  0.0  0.0  0.0  0.0  0.0  0.2  0.4  0.6  0.8  1.0

Funciones sobre vectores

Existen varias funciones dentro de R, que nos permiten obtener información útil sobre nuestros vectores. Vamos a ver algunas rápidamente:

#length() te da el número de elementos de tu vector
length(ejemplo1)

#Si tu vector tiene nombres, los puedes obtener con la función names()
names(experimento)

#class() te dice qué tipo de dato almacena tu vector
class(ejemplo1)

#min() te da el valor mínimo
min(ejemplo2)
#max() te da el valor máximo
max(ejemplo2)
#range() te da el rango (o sea el mínimo y el máximo)
range(ejemplo2)
#summary() te da un resumen de tu vector (media, mediana, cuartiles, etc.)
summary(ejemplo2)

#anyNA() te dice si en tu vector existen valores NA
anyNA(numerico)
#is.na() te dice si cada elemento en tu vector es NA o no
is.na(numerico)
[1] 11
[1] "muestra1"  "muestra2"  "muestra3"
[1] "numeric"

[1] 0
[1] 1
[1] 0  1
  Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
0.0000  0.0000  0.0000  0.2727  0.5000  1.0000

[1] TRUE
[1] FALSE  FALSE  FALSE  FALSE  TRUE  FALSE

Operaciones con vectores

Por último, pero no menos importante, veremos cómo funcionan las operaciones entre vectores. Si tenemos dos vectores con la mismo longitud, las operaciones siempre son entre elementos que ocupen la misma posición.

x <- c(1,2,3)
y <- c(2,3,4)

x+y
x-y
x*y
x/y
[1] 3  5  7
[1] -1  -1  -1
[1] 2  6  12
[1] 0.5000000  0.6666667  0.7500000

Si uno de los vectores es de mayor longitud (tiene más elementos), R (tras darte una advertencia) vuelve a empezar desde el principio del vector para poder terminar la operación:

z <- c(0,1)

x*z
[1] 0  2  0
Warning message:
In x * z : longer object length is not a multiple of shorter object length

Comentarios finales

Los vectores son de las estructuras de datos más importantes de R. Dominarlos nos permite adentrarnos con seguridad en muchísimos otros temas. Además, saber cómo manipularlos puede ahorrarnos mucho tiempo.

Esta entrada fue algo extensa. Si algo no quedó muy claro, por favor escríbenos abajo en los comentarios, ¡haremos lo posible por explicarlo mejor!

Eso es todo, ¡gracias por leer!


Esta publicación fue hecha usando R versión 3.6.3 (2020-02-29).

ADVERTISEMENT



← Publicación más antigua Publicación más reciente →


Acerca del autor


Foto del autor

Rosa Molina

Rosa es nuestra bióloga experta en R. Le gusta la observación de aves y tocar el piano de vez en cuando.




0 comentarios

Dejar un comentario

Por seguridad, los comentarios deben ser aprobados antes de ser publicados