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?
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
$
1
[1] “A” “B”
$
2
[1] “C” “D” “E”
$
3
[1] “F” “G”
$
4
[1] “H” “I”
$
5
[1] “J” “K”
“`