15.1 Vectores

Un vector es un conjunto de valores básicos del mismo tipo. La forma más sencilla de crear vectores es a través de la función c() que se usa para combinar (concatenar) valores.

x <- c(3, 5, 7)
x
## [1] 3 5 7
y <- c(8, 9)
y
## [1] 8 9
c(x, y)
## [1] 3 5 7 8 9
z <- c("Hola", "Adios")
z
## [1] "Hola"  "Adios"

15.1.1 Generación de secuencias

Existen varias funciones que pemiten obtener secuencias de números

x <- 1:5
x
## [1] 1 2 3 4 5
seq(1, 5, 0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(from=1, to=5, length=9)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
rep(1, 5)
## [1] 1 1 1 1 1

15.1.2 Generación secuencias aleatorias

A continuación se obtiene una simulación de 10 lanzamientos de un dado

sample(1:6, size=10, replace = T) #lanzamiento de un dado
##  [1] 2 3 6 2 6 6 4 6 3 2

Para simular el lanzamiento de una moneda podemos escribir

resultado <- c(cara=1,cruz=0) # se le han asignado nombres al objeto
print(resultado)
## cara cruz 
##    1    0
class(resultado)
## [1] "numeric"
attributes(resultado)
## $names
## [1] "cara" "cruz"
names(resultado)
## [1] "cara" "cruz"
lanz <- sample(resultado, size=10, replace = T)
lanz
## cara cruz cruz cara cara cruz cara cruz cruz cruz 
##    1    0    0    1    1    0    1    0    0    0
table(lanz)
## lanz
## 0 1 
## 6 4

Otros ejemplos

rnorm(10)  # rnorm(10, mean = 0, sd = 1)
##  [1]  0.49970320  0.85600027  0.22348053 -1.04091214 -0.09096274  0.38241536
##  [7] -0.98295854  1.27289321  0.28518504  0.51844945
runif(15, min = 2, max = 10)
##  [1] 4.033063 7.943182 7.190573 8.566533 3.625957 3.171083 7.570823 6.856241
##  [9] 6.811864 7.370427 7.401901 7.852309 3.311199 4.622022 2.411340

El lector puede utilizar la función help() para obtener la ayuda de las funciones anteriores.

15.1.3 Selección de elementos de un vector

Para acceder a los elementos de un vector se indica entre corchetes el correspondiente vector de subíndices (enteros positivos).

x <- seq(-3, 3, 1)
x
## [1] -3 -2 -1  0  1  2  3
x[1] # primer elemento
## [1] -3
ii <- c(1, 5, 7)
x[ii] #posiciones 1, 5 y 7
## [1] -3  1  3
ii <- x>0; ii
## [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
x[ii]  # valores positivos
## [1] 1 2 3
ii <- 1:3
x[-ii]  # elementos de x salvo los 3 primeros
## [1] 0 1 2 3

15.1.4 Ordenación de vectores

x <- c(65, 18, 59, 18, 6, 94, 26)
sort(x)
## [1]  6 18 18 26 59 65 94
sort(x, decreasing = T)
## [1] 94 65 59 26 18 18  6

Otra posibilidad es utilizar un índice de ordenación.

ii <- order(x)
ii  # índice de ordenación
## [1] 5 2 4 7 3 1 6
x[ii]  # valores ordenados
## [1]  6 18 18 26 59 65 94

La función rev() devuelve los valores del vector en orden inverso.

rev(x)
## [1] 26 94  6 18 59 18 65

15.1.5 Valores perdidos

Los valore perdidos aparecen normalmente cuando algún dato no ha sido registrado. Este tipo de valores se registran como NA (abreviatura de Not Available).

Por ejemplo, supongamos que tenemos registrado las alturas de 5 personas pero desconocemos la altura de la cuarta persona. El vector sería registrado como sigue:

altura <- c(165, 178, 184, NA, 175)
altura
## [1] 165 178 184  NA 175

Es importante notar que cualquier operación aritmética sobre un vector que contiene algún NA dará como resultado otro NA.

mean(altura)
## [1] NA

Para forzar a R a que ignore los valores perdidos se utliza la opción na.rm = TRUE.

mean(altura, na.rm = TRUE)
## [1] 175.5

R permite gestionar otros tipos de valores especiales:

  • NaN (Not a Number): es resultado de una indeterminación.

  • Inf: R representa valores no finitos \(\pm \infty\) como Inf y -Inf.


5/0  # Infinito
## [1] Inf
log(0)  # -Infinito
## [1] -Inf
0/0  # Not a Number
## [1] NaN

15.1.6 Vectores no numéricos

Los vectores pueden ser no numéricos, aunque todas las componentes deben ser del mismo tipo:

a <- c("A Coruña", "Lugo", "Ourense", "Pontevedra")
a
## [1] "A Coruña"   "Lugo"       "Ourense"    "Pontevedra"
letters[1:10]  # primeras 10 letas del abecedario
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
LETTERS[1:10]  # lo mismo en mayúscula
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
month.name[1:6]  # primeros 6 meses del año en inglés
## [1] "January"  "February" "March"    "April"    "May"      "June"

15.1.7 Factores

Los factores se utilizan para representar datos categóricos. Se puede pensar en ellos como vectores de enteros en los que cada entero tiene asociada una etiqueta (label). Los factores son muy importantes en la modelización estadística ya que Rlos trata de forma especial.

Utilizar factores con etiquetas es preferible a utilizar enteros porque las etiquetas son auto-descriptivas.

Veamos un ejemplo. Supongamos que el vector sexo indica el sexo de un persona codificado como 0 si hombre y 1 si mujer

sexo <- c(0, 1, 1, 1, 0, 0, 1, 0, 1)
sexo
## [1] 0 1 1 1 0 0 1 0 1
table(sexo)
## sexo
## 0 1 
## 4 5

El problema de introducir así los datos es que no queda reflejado la etiquetación de los mismos. Para ello guardaremos los datos en una estructura tipo factor:

sexo2 <- factor(sexo, labels = c("hombre", "mujer")); sexo2
## [1] hombre mujer  mujer  mujer  hombre hombre mujer  hombre mujer 
## Levels: hombre mujer
levels(sexo2)  # devuelve los niveles de un factor
## [1] "hombre" "mujer"
unclass(sexo2)  # representación subyacente del factor
## [1] 1 2 2 2 1 1 2 1 2
## attr(,"levels")
## [1] "hombre" "mujer"
table(sexo2)
## sexo2
## hombre  mujer 
##      4      5

Veamos otro ejemplo, en el que inicialmente tenemos datos categóricos. Los niveles se toman automáticamente por orden alfabético

respuestas <- factor(c('si', 'si', 'no', 'si', 'si', 'no', 'no'))
respuestas
## [1] si si no si si no no
## Levels: no si

Si deseásemos otro orden (lo cual puede ser importante en algunos casos, por ejemplo para representaciones gráficas), habría que indicarlo expresamente

respuestas <- factor(c('si', 'si', 'no', 'si', 'si', 'no', 'no'), levels = c('si', 'no'))
respuestas
## [1] si si no si si no no
## Levels: si no