Filtrar por un valor de columna en una matriz tridimensional en R.
Edit: He incluido un ejemplo reproducible.
Estoy tratando de realizar algunas operaciones simples en una de mis matrices. Mis matrices son matrices tridimensionales que contienen datos de captura y recaptura.
Las filas representan individuos.
Las columnas del 1 al 7 representan ocasiones de muestreo (años).
La columna 8 representa el sexo del individuo: 1 para hombres, 2 para mujeres.
libray(abind)
CH <- array(c(1,0,1,1,1,1,0), dim = c(5,7,10))
sex <- c(1,1,2,2,1)
CH_with_sex <- abind(CH, array(sex, replace(dim(CH), 2, 1)), along = 2)
CH_with_sex
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 0 1 1 1
[2,] 0 0 1 1 1 1 1 1
[3,] 1 1 1 1 0 0 1 2
[4,] 1 0 0 1 1 1 1 2
[5,] 1 1 1 1 1 0 0 1
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 0 1 1 1
[2,] 0 0 1 1 1 1 1 1
[3,] 1 1 1 1 0 0 1 2
[4,] 1 0 0 1 1 1 1 2
[5,] 1 1 1 1 1 0 0 1
dim(CH_with_sex)
[1] 5 8 10
Mi objetivo es separar hombres y mujeres de esta matriz tridimensional y tener dos matrices diferentes: una para los hombres y otra para las mujeres. Pensé en hacerlo filtrando por la columna 8, pero no logro encontrar la forma de hacerlo. Termino rompiendo o perdiendo la estructura de la matriz. ¿Algún consejo?
Mi resultado deseado para los hombres sería el siguiente:
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 0 1 1 1
[2,] 0 0 1 1 1 1 1 1
[3,] 1 1 1 1 1 0 0 1
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 0 0 1 1 1
[2,] 0 0 1 1 1 1 1 1
[3,] 1 1 1 1 1 0 0 1
Y esto para las mujeres:
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 1 0 0 1 2
[2,] 1 0 0 1 1 1 1 2
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 1 1 1 0 0 1 2
[2,] 1 0 0 1 1 1 1 2
davy.ai
Para separar los hombres y las mujeres del arreglo tridimensional, puedes utilizar la técnica de subconjuntos condicionales en R. Primero, puedes filtrar el arreglo basado en la columna 8 que contiene la información del sexo. Puedes usar el siguiente código para encontrar el índice de la columna 8 que indica hombres y mujeres:
La función
which()
devuelve los índices donde se cumple una condición dada (CH_with_sex[1, 1, ] == 1
oCH_with_sex[1, 1, ] == 2
). En este caso, encontramos los índicesmale_idx
yfemale_idx
donde el valor deCH_with_sex[1, 1, ]
es igual a 1 y 2, respectivamente.Una vez que hayas obtenido los índices, puedes obtener el subconjunto del arreglo utilizando estos índices:
Los arreglos resultantes
males
yfemales
contendrán solo las columnas donde la información del sexo sea igual a 1 (hombres) o 2 (mujeres). Las dimensiones de estos arreglos serán iguales al arreglo original, pero con menos columnas:Puedes verificar que los arreglos resultantes contengan los datos esperados imprimiéndolos: