Vectores

Un vector almacena una secuencia de valore simples del misma clase. Es decir, todos sus elementos son del mismo tipo de dato simple.

Crear un vector

La forma más habitual de crear un vector es usando la función c() (combine). Tambien podemos usar las funciones seq()

vector_numeros <- c(2, 4, 6, 8)

vector_numeros
[1] 2 4 6 8
seq_numeros <- seq(2, 6)
seq_numeros
[1] 2 3 4 5 6
seq_numeros2 <- 2:6
seq_numeros2
[1] 2 3 4 5 6
seq_numeros3 <- seq(2, 6, by = 0.5)
seq_numeros3
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0

La función c() permite añadir elementos a un vector existente, o combinar dos vectores

vector_numeros2 <- c(1, 3, 5)
vector_numeros2 <- c(vector_numeros2, 7)

vector_numeros2
[1] 1 3 5 7
comb_vector <- c(vector_numeros, vector_numeros2)
comb_vector
[1] 2 4 6 8 1 3 5 7
vector_caracteres <- c('A', 'B', 'C')
vector_caracteres
[1] "A" "B" "C"
vector_logico <- c(TRUE, FALSE, TRUE)
vector_logico
[1]  TRUE FALSE  TRUE
vector_logico2 <- 10 == 5
vector_logico2
[1] FALSE

La función rep() permite construir vectores a partir de la repetición de otro vector.

letras <- c('A', 'B', 'C')
letras
[1] "A" "B" "C"
letras_rep <- rep(letras, times = 3)
letras_rep
[1] "A" "B" "C" "A" "B" "C" "A" "B" "C"
letras_rep2 <- rep(letras, each = 3)
letras_rep2
[1] "A" "A" "A" "B" "B" "B" "C" "C" "C"

Aritmética de vectores

Las operaciones aritméticas con vectores se hacen posición a posición.

vector_numeros <- seq(10, 50, by = 5)
vector_numeros
[1] 10 15 20 25 30 35 40 45 50
vector_numeros + 1
[1] 11 16 21 26 31 36 41 46 51
vector_numeros / 2
[1]  5.0  7.5 10.0 12.5 15.0 17.5 20.0 22.5 25.0

Dos vectores:

vector_numeros_1 <- c(1, 2, 3, 4)
vector_numeros_2 <- c(1, 1, 0, 0)

vector_numeros_1 + vector_numeros_2
[1] 2 3 3 4
vector_numeros_1 - vector_numeros_2
[1] 0 1 3 4
vector_numeros_1 * vector_numeros_2
[1] 1 2 0 0
vector_numeros_1 / vector_numeros_2
[1]   1   2 Inf Inf

Se puede observar que en el resultado de la operación anterior en el vector resultante aparecen los valores Inf, es debido a que la división por 0 es indefinida (Infinito).

Dos vectores, diferente longitud:

vector_numeros_1 <- c(1, 2, 3, 4, 5, 6)
vector_numeros_2 <- c(1, 1, 0)

vector_numeros_1 + vector_numeros_2
[1] 2 3 3 5 6 6
vector_numeros_1 - vector_numeros_2
[1] 0 1 3 3 4 6
vector_numeros_1 * vector_numeros_2
[1] 1 2 0 4 5 0
vector_numeros_1 / vector_numeros_2
[1]   1   2 Inf   4   5 Inf

Lo que hace R es concatenar el vector de menor longitud consigo mísmo hasta rellenar los huecos hasta la longitud del mayor.

Important

Es mejor evitar las operaciones con objetos de diferente longitud.

Vector númerico y vector de texto.

letras <- c('A', 'B', 'C', 'D')
numeros <- c(1, 2, 3, 4, 5)

resultado = paste(letras, numeros, sep="-")
resultado
[1] "A-1" "B-2" "C-3" "D-4" "A-5"

La función paste() que concatena texto, pero numeros es un vector númerico. Internamente paste() llama a la función as.character() que convierte el tipo númerico a tipo texto.

numeros <- c(1, 2, 3, 4, 5)
numeros
[1] 1 2 3 4 5
texto_numeros <- as.character(numeros)
texto_numeros
[1] "1" "2" "3" "4" "5"

Elementos de un vector

Para poder manipular los elementos contenidos en un vector vamos a hacerlo usando los corchetes ([]) de la forma vector[ ]

numeros <- 10:20
numeros
 [1] 10 11 12 13 14 15 16 17 18 19 20

Obtener el elemento en la posicion cuarta

numeros[4]
[1] 13

Obterner todos los elementos menos el de la cuarta posicion

numeros[-4]
 [1] 10 11 12 14 15 16 17 18 19 20
numeros[c(4, 8)]
[1] 13 17
numeros[c(4:8)]
[1] 13 14 15 16 17
numeros[-c(4:8)]
[1] 10 11 12 18 19 20

Eliminar los elementos de la posicion 1 y 5

numeros <- 10:20
numeros
 [1] 10 11 12 13 14 15 16 17 18 19 20
numeros <- numeros[-c(1, 5)]
numeros
[1] 11 12 13 15 16 17 18 19 20

Añadir elementos nuevos.

numeros
[1] 11 12 13 15 16 17 18 19 20
numeros <- c(numeros, c(50, 100))
numeros
 [1]  11  12  13  15  16  17  18  19  20  50 100
Note

En definitiva lo que estamos haciendo es usar vectores índices para seleccionar elementos del vector.

vector[vector_indice]

Ordenar un vector

En ocasiones nos puede interesar ordenar los elementos de un vector. Esto se puede realizar con la función order()

numeros
 [1]  11  12  13  15  16  17  18  19  20  50 100
order(numeros, decreasing = TRUE)
 [1] 11 10  9  8  7  6  5  4  3  2  1

La función order devuelve el índice del vector ordenado, (no los valores).

numeros[order(numeros, decreasing = TRUE)]
 [1] 100  50  20  19  18  17  16  15  13  12  11

Máscara lógica

Otra manera de seleccionar los elementos de un vector es usar una máscara lógica (vector de valores lógicos). De la manera vector[mascara_logica]

numeros <- 10:20
numeros
 [1] 10 11 12 13 14 15 16 17 18 19 20
numeros < 15
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
numeros[numeros <15]
[1] 10 11 12 13 14

Vectores con nombres

En ocasiones puede ser interesante poner nombre a las posiciones de un vector.

log2FoldChange <- c(-5.3823, -1.2634, -1.0972, -1.0904, -0.9888, -0.9792)

log2FoldChange
[1] -5.3823 -1.2634 -1.0972 -1.0904 -0.9888 -0.9792
ensembles <- c('ENSMUSG00000020000', 
               'ENSMUSG00000060036', 
               'ENSMUSG00000060613', 
               'ENSMUSG00000038092', 
               'ENSMUSG00000020926', 
               'ENSMUSG00000001435')
ensembles
[1] "ENSMUSG00000020000" "ENSMUSG00000060036" "ENSMUSG00000060613"
[4] "ENSMUSG00000038092" "ENSMUSG00000020926" "ENSMUSG00000001435"
names(log2FoldChange) <- ensembles

log2FoldChange
ENSMUSG00000020000 ENSMUSG00000060036 ENSMUSG00000060613 ENSMUSG00000038092 
           -5.3823            -1.2634            -1.0972            -1.0904 
ENSMUSG00000020926 ENSMUSG00000001435 
           -0.9888            -0.9792 
log2FoldChange['ENSMUSG00000060613']
ENSMUSG00000060613 
           -1.0972 
log2FoldChange[c('ENSMUSG00000060613', 'ENSMUSG00000001435')]
ENSMUSG00000060613 ENSMUSG00000001435 
           -1.0972            -0.9792 

Valores faltantes

En algunos casos es posible que no se conozcan completamente los componentes de un vector. Cuando un elemento o valor está “no disponible” o es un “valor faltante” en el sentido estadístico, se le puede reservar un lugar dentro de un vector asignándole el valor especial NA. Los datos faltantes son comunes en los datos de multi-omicas, debido a una gran variedad de razones.

vector_na <- c(10:15, NA, 20:25, NA)

vector_na
 [1] 10 11 12 13 14 15 NA 20 21 22 23 24 25 NA
Important

En general cualquier operación con un valor faltante NA dará como resultado un NA.

mean(vector_na)
[1] NA

Afortunadamente las funciones en R suelen estar preparadas para manejar valores NA. Si leemos la documentación de la función mean() en R.

Observamos que la función mean para el parámetro na.rm tomo el valor FALSE por defecto. Si cambiamos el valor a TRUE los valores faltantes son eliminados antes de realizar la media.

mean(vector_na, na.rm = TRUE)
[1] 17.5

La función is.na() nos permite identificar los valores faltantes. Devuelve una máscara lógica que nos permite filtar el vector.

vector_na
 [1] 10 11 12 13 14 15 NA 20 21 22 23 24 25 NA
is.na(vector_na)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
[13] FALSE  TRUE
vector_sin_na <- vector_na[!is.na(vector_na)]
vector_sin_na
 [1] 10 11 12 13 14 15 20 21 22 23 24 25

Referencias

An Introduction to R