2.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"

2.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

2.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 5 4 3 5 2 5 2 4 2

Para simular el lanzamiento de una moneda podemos escribir

resultado <- c(cara = 1, cruz = 0) # se asignan nombres a los componentes
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
## cruz cara cara cara cara cara cruz cara cruz cara 
##    0    1    1    1    1    1    0    1    0    1
table(lanz)
## lanz
## 0 1 
## 3 7

Otros ejemplos

rnorm(10)  # rnorm(10, mean = 0, sd = 1)
##  [1]  0.7204527  0.4797719 -1.2713440 -0.4328451 -0.4684879 -0.3751133
##  [7]  0.5876768 -0.6550503 -0.5821055 -0.3319841
runif(15, min = 2, max = 10)
##  [1] 7.501522 5.048121 2.463137 3.060632 2.777952 7.384773 2.312678 3.896351
##  [9] 6.227847 2.721850 3.873522 5.734386 9.680021 4.607188 3.401449

Como ya se comentó, se puede utilizar help(funcion) (o ?funcion) para mostrar la ayuda de las funciones anteriores.

2.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

2.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

2.1.5 Datos faltantes

Los datos faltantes (también denominados valores 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

En muchas funciones para forzar a R a que ignore los valores perdidos se utiliza 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

2.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"

2.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 valores es que no queda reflejada la codificació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