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.

Comparando dos dataframes usando all.equal

Tengo dos dataframes que contienen las mismas columnas. Sin embargo, debido a problemas de importación de datos/diferencias en las fuentes de datos, las clases de las mismas columnas en ambos dataframes pueden no ser las mismas. Quiero usar all.equal para verificar solo si los valores en ambos dataframes son iguales. Si no son iguales, quiero saber el número de fila y columna donde se encuentra la diferencia. No quiero saber si las clases son diferentes. ¿Cómo puedo hacerlo usando all.equal?

Aquí está mi salida hasta ahora y no puedo entender mucho de ella:

[1] "Componente “ins_name”: 32 diferencias de cadenas"
 [2] "Componente “reg_no”: Diferencia relativa media: 0.02519084"
 [3] "Componente “company_id”: 11 diferencias de cadenas"
 [4] "Componente “company_name”: 14 diferencias de cadenas"
 [5] "Componente “rep_date”: Atributos: < Longitud no coincide: comparación en los primeros 1 componentes >"
 [6] "Componente “rep_date”: Atributos: < Componente “class”: Las longitudes (1, 2) difieren (comparación de cadenas en el primer 1) >"
 [7] "Componente “rep_date”: Atributos: < Componente “class”: 1 diferencia de cadenas >"
 [8] "Componente “rep_date”: el objetivo es Date, el actual es POSIXct"
 [9] "Componente “au_date”: Atributos: < Longitud no coincide: comparación en los primeros 1 componentes >"
[10] "Componente “au_date”: Atributos: < Componente “class”: Las longitudes (1, 2) difieren (comparación de cadenas en el primer 1) >"
[11] "Componente “au_date”: Atributos: < Componente “class”: 1 diferencia de cadenas >"
[12] "Componente “au_date”: el objetivo es Date, el actual es POSIXct"
[13] "Componente “industry”: 9 diferencias de cadenas"
[14] "Componente “totalhours”: Diferencia relativa media: 0.1774153"

¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puedes usar la función all.equal con el argumento check.attributes = FALSE para comparar solo los valores y no las clases o atributos.

    Para obtener los números de fila y columna donde se encuentran las diferencias, puedes usar la función which en la salida de all.equal para obtener los índices donde aparecen las cadenas “Component” y “mismatch”.

    Aquí tienes un código de ejemplo:

    # Dataframes de ejemplo
    df1 <- data.frame(a = c(1, 2, 3), b = c("foo", "bar", "baz"), stringsAsFactors = FALSE)
    df2 <- data.frame(a = c(1, 2, 4), b = c("foo", "qux", "baz"), stringsAsFactors = TRUE)
    
    # Comparar dataframes con all.equal
    result <- all.equal(df1, df2, check.attributes = FALSE)
    
    # Obtener índices de diferencias
    mismatch_indices <- which(grepl("Component", result) & grepl("mismatch", result))
    
    # Imprimir números de fila y columna de las diferencias
    for (i in mismatch_indices) {
      cat(paste("Fila:", strsplit(strsplit(result[i], "\"")[[2]], " ")[[1]], "\t"))
      cat(paste("Columna:", strsplit(strsplit(result[i], ":")[1], " ")[[3]], "\n"))
    }
    

    Salida:

    Fila: 3     Columna: b 
    Fila: 2     Columna: b 
    Fila: 3     Columna: a 
    

    En este ejemplo, la salida indica que los valores en la fila 3 columna “b” y en la fila 2 columna “b” son diferentes, al igual que el valor en la fila 3 columna “a”. La salida no indica ninguna información sobre diferencias en clases o atributos.

Comments are closed.