Skip to content

[bug] Colonnes factor : classées « character » par detect_column_types mais jamais normalisées par preprocess_dataframe #28

Description

@VincentGuyader

Contexte

Trou silencieux entre deux modules :

  • detect_column_types() (R/data_types.R) classe les factors comme character (intentionnel, testé : test-data-types.R:27-30) → ils reçoivent les règles by_type: character (case_insensitive, trim) ;
  • mais normalize_text() ne transforme que les vecteurs is.character() (R/preprocessing.R) et preprocess_dataframe garde le même prédicat → une colonne factor n'est jamais trimée/lowercasée, sans aucun avertissement.

Résultat : mêmes données, verdict différent selon que la colonne est character ou factor — surprenant pour l'utilisateur (stringsAsFactors, imports SAS/SPSS via haven, etc.).

Reprex

library(datadiff)
ref  <- data.frame(id = 1:2, s = c("alpha", "beta"))
cand_chr <- data.frame(id = 1:2, s = c("ALPHA", " beta"))
cand_fct <- data.frame(id = 1:2, s = factor(c("ALPHA", " beta")))

path <- tempfile(fileext = ".yaml")
write_rules_template(ref, key = "id", path = path,
                     character_case_insensitive = TRUE, character_trim = TRUE)

compare_datasets_from_yaml(ref, cand_chr, key = "id", path = path)$all_passed  # TRUE
compare_datasets_from_yaml(ref, cand_fct, key = "id", path = path)$all_passed  # FALSE (ou type_mismatch)
# même contenu logique, verdicts différents, aucun warning expliquant pourquoi

Critères de succès

  • Comportement décidé et documenté : soit conversion factor → character en préprocessing (avec note dans la doc), soit warning explicite (« column 's' is a factor; text normalization rules are not applied »).
  • Le reprex donne le même verdict pour character et factor (ou un warning actionnable dans le cas factor).
  • Tests couvrant factor côté référence, côté candidat, et des deux côtés.
  • Clarifier au passage le sort des autres types « fourre-tout character » de detect_column_types() (list-columns, integer64) : verdict défini ou warning.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions