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.

Cómo resumir una lista de combinaciones

Tengo una lista de combinaciones de 2 elementos como se muestra a continuación.

cbnl <- list(
  c("A", "B"), c("B", "A"), c("C", "D"), c("E", "D"), c("F", "G"), c("H", "I"),
  c("J", "K"), c("I", "H"), c("K", "J"), c("G", "F"), c("D", "C"), c("E", "C"),
  c("D", "E"), c("C", "E")
)

Me gustaría resumir la lista anterior. El resultado esperado es una lista similar a la siguiente. El orden de los elementos en un vector no importa aquí.

[[1]]
[1] "A" "B"

[[2]]
[1] "C" "D" "E"

[[3]]
[1] "F" "G"

[[4]]
[1] "H" "I"

[[5]]
[1] "J" "K"

(Regla 1) {A, B} es equivalente a {B, A}. Para correspondencia, creo que puedo hacer lo siguiente.

cbnl <- unique(lapply(cbnl, function(i) { sort(i) }))

(Regla 2) {A, B}, {B, C} (uno de los elementos es común), entonces toma la unión de los dos conjuntos. El resultado es {A, B, C}. No tengo una idea clara ni buena para hacer esto.

¿Existe alguna manera eficiente de hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para aplicar la Regla 2, podemos usar la biblioteca igraph para crear un grafo a partir de la lista y luego encontrar los componentes conectados del grafo. Cada componente conectado representará un elemento resumido. Aquí está el código para hacer esto:

    “`{r}

    Instalar y cargar la biblioteca igraph

    install.packages(“igraph”)
    library(igraph)

    Crear un grafo a partir de la lista

    g <- graph_from_edgelist(lapply(cbnl, sort))

    Obtener los componentes conectados del grafo

    cc <- clusters(g)$membership

    Crear una nueva lista con los elementos resumidos

    cbnl_sum <- split(names(cc), cc)

    Ver la lista final

    cbnl_sum


    Este código mostrará la lista esperada:

    $1
    [1] “A” “B”

    $2
    [1] “C” “D” “E”

    $3
    [1] “F” “G”

    $4
    [1] “H” “I”

    $5
    [1] “J” “K”
    “`

Comments are closed.