Entenderemos
indexación acceder a una parte de un objeto. Recordemos que, en R, tenemos
objetos atómicos (de un solo tipo de clases, por ejemplo, solo números, o solo
texto) y recursivos. Estos combinaban diferentes objetos con formas distintas,
por ejemplo, texto y números. Según chatGPT
“en R, "indexar" se
refiere a acceder a elementos específicos de un vector, matriz, lista o data
frame utilizando su posición numérica o su nombre. Indexar te permite extraer o
modificar valores individuales o conjuntos de valores de una estructura de
datos”.
INDEXACIÓN NUMÉRICA
En el
caso de la indexación numérica, accedemos a parte de ese vector indicando a
cuál posición deseamos acceder. Debajo colocamos diferentes ejemplos usando el
vector edad.
Ej. 1: La
primera posición, colocamos corchetes [] posterior al vector que contienen los
elementos al cual queremos acceder (edad en este caso).
edad <- c(17,22,31,14,12)
edad[1]
[1] 17
Ej. 2: Si el número se coloca en negativo,
indica que no queremos acceder a esa parte del vector. Regresa todo, menos la posición
indicada con menos.
edad[-1]
[1] 22 31 14 12
Ej. 3: Igual podemos acceder a múltiples
posiciones de un vector, colocando un vector de números entre los corchetes. Si
repites el 1 varias veces te regresara la posición 1 cuantas veces como repitas
el 1.
> edad[c(1,4)]
[1] 17 14
Ej. 4: Acceder a la última posición de un
vector usando la función length.
edad[length(edad)]
[1] 12
Ej. 5: Igual podemos usar el operador dos
puntos para generar una secuencia. Sí le indicamos esta secuencia a R, entonces
regresa las posiciones del vector que están dentro de la misma.
edad[1:3]
[1] 17 22 31
Ej. 6:
imaginemos ahora
que queremos acceder a las dos ultimas posiciones del vector, podemos indicar
la longitud de la misma:
edad[c(4,5)]
[1] 14 12
Ej. 7: No obstante, el ejemplo anterior
deja de funcionar si agregamos datos al vector anterior:
edad <- c(edad, 14,24)
[1] 17 22 31 14 12 14 24
edad[(length(edad)-1):length(edad)]
[1] 14 24
Ej. 8:
Entonces, si queremos
eliminar las dos ultimas posiciones de un vector, colocamos el signo de menos delante
de la secuencia.
edad[-c((length(edad)-1):length(edad))]
[1] 17 22 31 14 12
INDEXACIÓN
LÓGICA
En este
caso colocamos un vector lógico entre corchetes, en lugar de números. Este
permite acceder a elementos que cumplen con alguna condición, sin importar donde
estén colocados los mismos.
Ej. 9: Llamar a los menores de edad.
edad[edad<18]
[1] 17 14 12 14
Ej. 10: Llamar a los que tienen edades
entre 5-15 años.
edad[edad>=5 &
edad<=15]
[1] 14 12 14
Ej. 11:
Podemos indexar a
partir de la información de un segundo vector. Supongamos tenemos el vector
mujer que indica el sexo de las personas. Entonces podemos recuperar las edades
de las mujeres.
mujer<-c(1,0,1,0,1,0,0)
edad[mujer==1]
[1] 17 31 12
Tener pendiente
que, si usas esta variable directamente para indexar el vector, este te
regresara la primera posición tantas veces como se repita en el vector numérico
mujer. Recuerde que este es un vector numérico.
edad[c(1,1,1)]
[1] 17 17 17
edad[mujer]
[1] 17 17 17
Por
tanto, si se quiere usar directamente, se debe definir como un vector lógico.
mujer1<-c(T,F,T,F,T,F,F)
edad[mujer1]
OTROS EJEMPLOS
Ej. 12:
Indexar utilizando
nombres asignados a los datos.
nombres <-
c("Ana", "Pedro", "Juana", "Johan",
"Lia", NA, "Julio")
names(edad) <- nombres
edad
Ana Pedro Juana Johan Lia
<NA> Julio
17
22 31 14
12 14 24
edad["Juana"]
Juana
31
Ej. 13:
Combinar vectores. Mujeres menores de edad. Si
colocamos el 0, se elegirían mujeres o menores de edad.
edad[mujer==1 &
edad<=17]
Ana Lia
17 12
Como se
puede ver hasta aquí, solo es cuestión de usar adecuadamente los operadores lógicos,
que vimos en la clase 1.
Ej. 14: acceder a una secuencia de
posiciones.
Esta
forma de generar secuencias igual nos permite acceder por ejemplo a todas las
posiciones pares, 2,4,6,…. Pensar en alguna aplicación, imagine tiene una data
mensual, y desea acceder a los meses 1,4,7,10… Para esto usamos la función
seq.
1:5
[1] 1 2 3 4 5
seq(1,5, by = 1)
[1] 1 2 3 4 5
En el siguiente
ejemplo accederá a las posiciones entre 1 y 7, iniciando en 1 y avanzando de 2
en e2. 1,3,4…
edad[seq(1, length(edad), by = 2)]
Ana
Juana Lia Julio
17
31 12 24
Ej. 15: Ordenar de menor a mayor. Como
orden regresa la posición que ocupa cada elemento en un vector determinado, caminando
de menor a mayor. Como podemos ver en el ejemplo siguiente, se verifica la
salida de order, 5, 4, 6, … indica que el menor valor se encuentra en la posición
5 del vector, el segundo menor, en la posición 4, y así de forma sucesiva.
edad
Ana Pedro Juana Johan Lia
<NA> Julio
17
22 31 14
12 14 24
order(edad)
[1] 5 4 6 1 2 7 3
Ahora,
podemos obtener un vector ordenado de menor a mayor edad.
edad[order(edad)]
Lia Johan
<NA> Ana Pedro Julio Juana
12
14 14 17
22 24 31
Igual, podemos obtener los nombres, ordenados
del menor al mayor.
nombres[order(edad)]
[1] "Lia" "Johan" NA "Ana" "Pedro" "Julio"
"Juana"
Ej. 16:
acceder al mínimo y
máximo usando order. Solo debemos acceder a las posiciones extremas.
Persona
con menor edad.
edad[order(edad)[1]]
Lia
12
Persona
con mayor edad.
edad[order(edad)[length(edad)]]
Juana
31
Ej. 17: Indexación
con which. Este comando regresa la posición donde la variable cumple con una
determinada condición. Por ejemplo, identificar la posición donde se encuentra la
persona con la edad mínima.
which(edad==min(edad))
Lia
5
Entonces,
podemos usar esta coordenada para poder recuperar la edad mínima disponible en
la data. Antes vimos en qué posición estaba, ahora vemos cual es su edad.
edad[which(edad==min(edad))]
Lia
12
Ej. 18:
Podemos seleccionar
múltiples nombres usando el operador contenido en. El mismo permite indicar un
conjunto de nombres, para posteriormente, buscar estos nombres en el vector de edad.
personas_seleccionadas <-
c("Ana", "Lia", "Julio")
edad[names(edad) %in% personas_seleccionadas]
Ana Lia Julio
17
12 24
Ej. 19:
Acceder a las
edades correspondientes a los nombres que no son NA.
edad[!is.na(names(edad))]
Ana Pedro Juana Johan Lia Julio
17
22 31 14
12 24
Ej. 20:
Igual podemos usar
la indexación para modificar valores de un vector. Podemos verificar que un
nombre es NA, entonces podemos identificar ese NA y cambiarlo por Walker.
nombres[is.na(nombres)] <-
"Walker"
names(edad) <- nombres
edad
Ana
Pedro Juana Johan
Lia Walker Julio
17
22 31 14
12 14 24
Ahora vamos a sustituir la edad de Walker, por 16 años.
Debido a que el se cambio la edad cuando jugaba pelota. Le quitaron dos años.
edad[nombres ==
"Walker"] <- 16
edad
Ana
Pedro Juana Johan
Lia Walker Julio
17
22 31 14
12 16 24
Espero
les haya sido de utilidad… Gracias por visitarnos.