es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    male_idx <- which(CH_with_sex[1, 1, ] == 1)
    female_idx <- which(CH_with_sex[1, 1, ] == 2)
    

    La función which() devuelve los índices donde se cumple una condición dada (CH_with_sex[1, 1, ] == 1 o CH_with_sex[1, 1, ] == 2). En este caso, encontramos los índices male_idx y female_idx donde el valor de CH_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:

    males <- CH_with_sex[, , male_idx]
    females <- CH_with_sex[, , female_idx]
    

    Los arreglos resultantes males y females 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:

    dim(males)
    [1] 5 7 4
    
    dim(females)
    [1] 5 7 6
    

    Puedes verificar que los arreglos resultantes contengan los datos esperados imprimiéndolos:

    males
    , , 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
    
    , , 3
    
         [,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
    
    , , 4
    
         [,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]
    
    females
    , , 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
    
    , , 3
    
         [,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
    
    , , 4
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    1    1    1    0    0    1    2
    
    , , 5
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    0    0    1    1    1    1    2
    
    , , 6
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    0    0    1    1    1    1    2
    

Comments are closed.