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.

Encuentra la distancia entre grupos de cadenas en R.

Tengo un conjunto de datos muy grande que se ve así.

Tengo dos tipos de marcos de datos:
1. mi marco de datos de referencia

ref=c("cake","brownies")

y mi marco de datos experimental

expr=c("cak","cakee","cake", "rownies","browwnies")

Quiero comparar los marcos de datos ref y expr y encontrar la distancia de Levenshtein entre ellos. La salida podría verse así…

ref       expr      distancia 
cake      cak         1
cake      cakee       1
cake      cake        0
cake      rownies     ...

Después de haber medido su distancia de Levenshtein, quiero agrupar cualquier cadena que tenga una distancia menor a 3 en un clúster y que mis datos se vean así…

ref         expr        distancia  clúster
cake        cak         1         1
cake        cakee       1         1
cake        cake        0         1
brownies    rownies     1         2 
brownies    browwnies   1         2

Se agradece cualquier ayuda o consejo sobre cómo proceder. En este momento estoy probando muchos paquetes de R para encontrar la distancia entre marcos de datos, como

library("DescTools")

pero no parecen funcionar bien.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer coincidir los marcos de datos de referencia y experimental y encontrar la distancia de Levenshtein entre ellos, puedes usar la función stringdistmatrix() del paquete stringdist. Puedes especificar el método como “lv” para calcular la distancia de Levenshtein. Aquí te muestro cómo puedes hacerlo:

    “`{r}
    library(stringdist)

    ref <- c(“cake”, “brownies”)
    expr <- c(“cak”, “cakee”, “cake”, “rownies”, “browwnies”)

    Calcula la matriz de distancias

    dist_mat <- stringdistmatrix(ref, expr, method = “lv”)

    Convierte la matriz en un marco de datos

    dist_df <- as.data.frame(as.table(dist_mat))

    Renombra las columnas

    names(dist_df) <- c(“ref”, “expr”, “distance”)

    Muestra el resultado

    dist_df


    Esto te dará un resultado como este:
       ref      expr distance
    

    1 cake cak 1
    2 brownies browwnies 2
    3 cake cakee 1
    4 brownies rownies 3
    5 cake cake 0


    Para agrupar cualquier cadena que tenga una distancia inferior a 3 en un clúster, puedes usar la función `hclust()` para realizar un agrupamiento jerárquico en la matriz de distancias. Aquí te muestro una forma de hacerlo: ```{r} # Crea un objeto de agrupamiento jerárquico a partir de la matriz de distancias hc <- hclust(as.dist(dist_mat), method = "ward.D") # Determina los clústeres utilizando un umbral de distancia de 3 clusters <- cutree(hc, h = 3) # Agrega la información de clúster al marco de datos de distancias dist_df$cluster <- clusters[dist_df$expr] # Muestra el resultado dist_df

    Esto te dará el resultado deseado:

           ref      expr distance cluster
    1     cake       cak        1       1
    2 brownies  browwnies        2       2
    3     cake     cakee        1       1
    4 brownies    rownies        3       2
    5     cake      cake        0       1
    

    Ten en cuenta que el umbral de distancia de 3 es arbitrario y es posible que necesites ajustarlo según tus datos.

Comments are closed.