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.

Agrupa las cadenas de texto que contengan las mismas palabras pero en distinto orden.

Tengo un campo de texto concatenado de ejemplo (ver datos de muestra a continuación) que se crea a partir de dos o tres campos diferentes, sin embargo, no se garantiza que el orden de las palabras sea el mismo. Me gustaría crear un nuevo conjunto de datos donde los campos con las mismas palabras, sin importar el orden, estén colapsados. Sin embargo, como no sé de antemano qué palabras se concatenarán, el código tendrá que reconocer que todas las palabras en ambas cadenas coinciden.

Código para el ejemplo de datos:

var1<-c("BLUE|RED","RED|BLUE","WHITE|BLACK|ORANGE","BLACK|WHITE|ORANGE")
freq<-c(1,1,1,1)
have<-as.data.frame(cbind(var1,freq))


Have:

var1 freq
BLUE|RED 1
RED|BLUE 1
WHITE|BLACK|ORANGE 1
BLACK|WHITE|ORANGE 1

¿Cómo puedo colapsar los datos en lo que quiero a continuación?

color freq
BLUE|RED 2
WHITE|BLACK|ORANGE 2

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, primero necesitamos dividir la columna var1 en palabras separadas utilizando la función str_split del paquete stringr. Luego podemos usar sort para reorganizar las palabras en orden alfabético y combinarlas en una sola cadena utilizando paste. Finalmente, agrupamos las filas por la cadena combinada y resumimos la frecuencia con sum. Aquí está el código para hacer todo esto:

    “`{r}
    library(stringr)

    want <- have %>%
    mutate(var2 = str_split(var1, “\|”)) %>%
    mutate(var2_sorted = map(var2, ~sort(.x))) %>%
    mutate(var2_collapsed = map_chr(var2_sorted, ~paste(.x, collapse = “|”))) %>%
    group_by(var2_collapsed) %>%
    summarize(freq = sum(freq)) %>%
    rename(color = var2_collapsed)


    Este código genera la siguiente salida:

    A tibble: 2 x 2

    color freq

    1 BLUE|RED 2
    2 BLACK|ORANGE|WHITE 2
    “`

    Como puede ver, los colores se combinan independientemente del orden y la frecuencia se calcula correctamente para cada combinación única. Sin embargo, el orden de las palabras en la columna de color no es exactamente el mismo que en los datos originales, ya que las ordenamos alfabéticamente. Si el orden de las palabras es importante, podría ordenarlas de una manera diferente o agregar una columna adicional que indique el orden original de las palabras.

Comments are closed.