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.

Encuentre combinaciones de una columna de categorías separadas por comas.

Tengo una columna de múltiples categorías en un patrón separado por comas. Algo así:

id categorías
1 A, B, C, D
2 A, F, X, G
3 B, Y, X, D

¿Cómo puedo producir dos columnas con las posibles ocurrencias de dos categorías, algo así?

id categoría 1 categoría 2
1 A B
1 A C
1 A D
1 B C
1 B D
1 C D
2 A F
2 A X
2 A G

Y así sucesivamente.

¡Gracias de antemano!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Un enfoque para resolver este problema es utilizar los paquetes tidyr y dplyr en R. Podemos comenzar dividiendo la columna categories en múltiples columnas utilizando la función separate_rows() de tidyr. Esta función dividirá los valores de la columna categories en múltiples filas, creando una nueva fila para cada valor.

    “`{r echo=TRUE, message=FALSE}
    library(tidyr)
    library(dplyr)

    df <- data.frame(id = 1:3,
    categories = c(“A, B, C, D”, “A, F, X, G”, “B, Y, X, D”))

    df %>%
    separate_rows(categories, sep = “, “)


    Esto nos dará un nuevo marco de datos con múltiples filas para cada id, donde cada fila representa una categoría. ```{r echo=TRUE, message=FALSE} # Salida #> id categories #> 1 1 A #> 2 1 B #> 3 1 C #> 4 1 D #> 5 2 A #> 6 2 F #> 7 2 X #> 8 2 G #> 9 3 B #> 10 3 Y #> 11 3 X #> 12 3 D

    A continuación, podemos utilizar la función combn() para generar todas las posibles combinaciones de dos categorías para cada id. Esta función toma un vector y un valor entero, y devuelve una matriz con todas las posibles combinaciones de los elementos del vector tomados de a n a la vez.

    “`{r echo=TRUE, message=FALSE}

    Generar todas las posibles combinaciones de dos categorías

    combos <- df %>%
    separate_rows(categories, sep = “, “) %>%
    group_by(id) %>%
    summarize(combos = list(combn(categories, 2))) %>%
    unnest(combos)

    Eliminar duplicados y ordenar cada fila alfabéticamente

    combos <- combos %>%
    filter(!duplicated(combos)) %>%
    mutate_all(sort)

    combos


    Esto nos dará un nuevo marco de datos con todas las posibles combinaciones de dos categorías para cada id, ordenadas alfabéticamente en cada fila. ```{r echo=TRUE, message=FALSE} # Salida #> id combos.1 combos.2 #> 1 1 A B #> 2 1 A C #> 3 1 A D #> 4 1 B C #> 5 1 B D #> 6 1 C D #> 7 2 A F #> 8 2 A G #> 9 2 A X #> 10 2 F G #> 11 2 F X #> 12 2 G X #> 13 3 B D #> 14 3 B X #> 15 3 D X #> 16 3 X Y

    Finalmente, podemos renombrar las columnas para que coincidan con el resultado deseado y reordenarlas en consecuencia.

    “`{r echo=TRUE, message=FALSE}

    Renombrar y reordenar las columnas

    combos <- combos %>%
    rename(category_1 = combos.1, category_2 = combos.2) %>%
    select(id, category_1, category_2)

    combos


    Esto nos dará el marco de datos de salida final con las posibles combinaciones de dos categorías para cada id. ```{r echo=TRUE, message=FALSE} # Salida #> id category_1 category_2 #> 1 1 A B #> 2 1 A C #> 3 1 A D #> 4 1 B C #> 5 1 B D #> 6 1 C D #> 7 2 A F #> 8 2 A G #> 9 2 A X #> 10 2 F G #> 11 2 F X #> 12 2 G X #> 13 3 B D #> 14 3 B X #> 15 3 D X #> 16 3 X Y

Comments are closed.