Vectores

Ejemplo 1. Generación de secuencias

  x <- c(1, 2, 3, 4, 5)
  x <- 1:10
  y <- -5:3
  1:4 + 1
  1:(4 + 1)
  x <- seq(from = 2, to = 18, by = 2)
  x <- seq(from = 2, to = 18, length = 30)
  y <- seq(along = x)
  z2 <- c(1:5, 7:10, seq(from = -7, to = 5, by = 2))
  rep(1, 5)
  x <- 1:3
  rep(x, 2)
  y <- rep(5, 3)
  rep(x, y)
  rep(1:3, rep(5, 3))
  rep(x, x)
  rep(x, length = 8)
  gl(3, 5)  # como rep(1:3, rep(5, 3))
  gl(4, 1, length = 20)  # ¡Alerta! gl genera factores
  gl(3, 4, label = c("Sano", "Enfermo", "Muerto"))
  expand.grid(edad = c(10, 18, 25), sexo = c("Macho", "Hembra"), loc = 1:3)

Podemos combinar: z3 <- c(1:5, rep(8, 3))

Ejemplo 2. Generación de secuencias aleatorias

sample(5)
sample(5, 3)
x <- 1:10
sample(x)
sample(x, replace = TRUE)
sample(x, size = 2 * length(x), replace = TRUE)
probs <- x/sum(x)
sample(x, prob = probs)

Números aleatorios rDistribución(n,parámetros)

rnorm(10)  # rnorm(10, mean = 0,sd = 1)
runif(8, min = 2, max = 10)

Ejemplo 3. Selección de elementos de un vector

x <- 1:5
x[1]
x[3]
x[c(1, 3)]
x[x > 3]
x > 3
y <- x > 3
x[y]
x[-c(1, 4)]
y <- c(1, 2, 5)
x[y]
names(x) <- c("a", "b", "c", "d", "patata")
x[c("b", "patata")]

Ejemplo 4. Valores perdidos

NA es el código de 'Not available'.

v <- c(1, 6, 9, NA)
is.na(v)
which(is.na(v))
w <- v[!is.na(v)]  # sin los valores perdidos
v == NA  # !No funciona! ¿Por qué?

Si es necesario podemos sustituir NA por, p.ej. 0, con la instrucción

v[is.na(v)] <- 0

Cuidado, el infinito y NaN ('not a number') son diferentes de NA.

5/0
-5/0
0/0
is.infinite(-5/0)
is.nan(0/0)
is.na(5/0)

Con algunas funciones puede especificarse qué hacer con los valores perdidos.

xna <- c(1, 2, 3, NA, 4)
mean(xna)
mean(xna, na.rm = TRUE)

Además para 'modelling functions' (ej. lm) lo mejor es usar na.omit o na.exclude. Esta última es más conveniente para generar predicciones, residuos, etc.

Si queremos eliminar todos los NA:

  XNA <- matrix(c(1, 2, NA, 3, NA, 4), nrow = 3)
  XNA
  X.no.na <- na.omit(XNA)

Ejemplo 5. Ordenación de vectores

x1 <- c(5, 1, 8, 3)
order(x1)
sort(x1)
rev(x1)
rank(x1)
x1[order(x1)]
x2 <- c(1, 2, 2, 3, 3, 4)
rank(x2)
min(x1)
which.min(x1)
which(x1 == min(x1))
y <- c(1, 1, 2, 2)
order(y, x)

order y sort admiten decreasing = TRUE.

Ejemplo 6. Vectores de caracteres

Otras funciones de manipulación de caracteres:

  codigos <- paste(c("A", "B"), 2:3, sep = "")
  codigos <- paste(c("A", "B"), 2:3, sep = ".")
  juntar <- paste(c("una", "frase", "simple"), collapse = " ")
  columna.a <- LETTERS[1:5]
  columna.b <- 10:15
  juntar <- paste(columna.a, columna.b, sep = "")
  substr("abcdef", 2, 4)
  x <- paste(LETTERS[1:5], collapse = "")
  substr(x, 3, 5) <- c("uv")

Más funciones: nchar, grep, match, pmatch, tolower, toupper, sub, gsub, regexpr.

Ejemplo 7. Factores

Consideremos una secuencia de códigos postales:

  codigo.postal <- c(28430, 28016, 28034)
  mode(codigo.postal)

No deberíamos usar el código postal en, por ejemplo, un ANOVA como si fuera un vector numérico. Usar variables aparentemente numéricas en análisis estadísticos es un grave error. Por tanto, debemos transformar dicha variable a un factor (automaticamente se generarán los niveles del mismo)

codigo.postal <- factor(codigo.postal)  # mejor
mode(codigo.postal)

Si queremos convertir un vector factor en numérico:

  y <- rnorm(10)
  x <- rep(1:5, 2)
  aov(y ~ x)  # ¡no es lo que queremos!
  aov(y ~ factor(x))  # mejor

  x <- c(34, 89, 1000)
  y <- factor(x)
  y
  as.numeric(y)  # mal. los valores han sido recodificados
  as.numeric(as.character(y))  # bien

Podemos fijar el orden de las etiquetas:

  ftr1 <- factor(c("alto", "bajo", "medio"))
  ftr1
  ftr1 <- factor(c("alto", "bajo", "medio"), levels = c("bajo", "medio", "alto"))
  ftr1