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))
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)
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")]
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)
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
.
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
.
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