11 abr 2024

20 ejemplos de Indexación de un vector en R

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

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...