3.3 Selecciones

Para seleccionar elementos de un vector se usa el corchete []. Pero, a diferencia de lo que ocurre con las tablas, como los vectores son objetos unidimensionales, sin coma. Obviamente, el corchete sigue admitiendo no solo los índices de los elementos que se quieren extraer, sino que además permite utilizar condiciones lógicas, etc.

x <- x^2
x[1:3]
x[c(1,3)]
x[x > 25]
x[3:1]
x[-(1:2)]
x[-length(x)]

Advierte en el ejemplo anterior el uso (y el efecto) del signo menos y de las condiciones lógicas dentro de los corchetes.

Selecciona todos los elementos de un vector menos menos los dos últimos.

Implementa la función diff (las diferencias entre cada valor de un vector y el que lo precede) a mano. Nota: la función diff existe en R; pruébala en caso de duda.

El corchete también permite seleccionar elementos de un vector por nombre. En efecto, en R se pueden asociar nombres a los elementos de un vector. Lo hace automáticamente, por ejemplo, table (para poder saber a qué etiqueta corresponde cada conteo):

z <- table(iris$Species)
z["setosa"]
## setosa 
##     50
z[c("setosa", "virginica")]
## 
##    setosa virginica 
##        50        50

En cierto sentido, los vectores con nombre operan (aunque con algunas diferencias técnicas) como los diccionarios de Python o las tablas hash de otros lenguajes de programación: contienen parejas clave-valor.

Una propiedad muy importante del corchete es que permite, además de seleccionar, cambiar el contenido de los elementos seleccionados de un vector. Por ejemplo:

z <- 1:10
z[z < 5] <- 100
z
##  [1] 100 100 100 100   5   6   7   8   9  10

Reemplazar subselecciones es muy útil: permitirá, por ejemplo, cambiar las edades negativas por un valor con sentido, sustituir los nulos por un determinado valor por defecto, reemplazar los valores que excedan un tope por dicho tope, etc.

El nombre de las columnas de una tabla también es un vector. Por eso, para cambiar el nombre de una columna podemos hacer lo siguiente:

mi.iris <- iris   # una copia de iris
colnames(mi.iris)[5] <- "Especie"

Lo mismo ocurre con los nombres de un vector, aunque en este caso, la función correspondiente es names:

z <- table(iris$Species)
names(z)
names(z)[1] <- "A"
names(z)

Cambia (en una sola expresión) los nombres de las dos primeras columnas de mi.iris por su traducción al español.

Frecuentemente se quiere muestrear un vector, es decir, obtener una serie de elementos al azar dentro de dicho vector. Para ello se utiliza la función sample:

sample(x, 4)
sample(x, 100)                  # ¡falla!
sample(x, 100, replace = TRUE)  # manera correcta

La función sample trata el vector como una urna y a sus elementos como bolas contenidas en ella que va extrayendo al azar. Obviamente, es incapaz de extraer más elementos de los que contiene la urna. Pero existe el la opción de que el muestreo se realice con reemplazamiento, i.e., de modo que cada vez que sample extraiga una bola, la reintroduzca en la urna.

Muestrea iris, es decir, extrae (p.e., 30) filas al azar de dicha tabla. Pista: recuerda que ordenar era seleccionar ordenadamente; de igual manera, en una tabla, muestrear será…

El muestreo de vectores es fundamental en diversos ámbitos. Por ejemplo, a la hora de realizar los llamados tests A/B] y determinar qué observaciones van al grupo A y cuáles al B.

Parte iris en dos partes iguales (75 observaciones cada uno) con las filas elegidas al azar (¡y complementarias!).