Cohérence des données

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Cohérence des données

Messagepar Montana ROQUILLET » 22 Mai 2019, 08:02

Bonjour,

Je reçois régulièrement des fichiers de données au même format, et je souhaiterai pouvoir vérifier leur cohérence sans avoir besoin de visualiser tous mes fichiers.
Je souhaiterai vérifier que :
- les variables qualitatives sont effectivement qualitatives
- les variables numériques comportent bien des chiffres
- les dates sont bien des dates
- les valeurs dans les variables quantitatives sont comprises entre 0 et 999

L'idée serait d'afficher "True" ou "False" selon si le fichier est cohérent ou non.

J'ai pensé vérifier la présence de chaque lettre de l'alphabet et chaque chiffre dans chacune des variables, à l'aide d'un grep, mais ça me paraît long et fastidieux et je n'ai pas réussi à utiliser la fonction grep.

Votre aide serait la bienvenue.

Merci,

Montana ROQUILLET

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Cohérence des données

Messagepar Serge Rapenne » 22 Mai 2019, 09:28

Bonjour,

Sous réserve que tu connaisses le type auquel doit appartenir chaque colonne, voici une possibilité pour faire ce que tu veux

Code : Tout sélectionner

#generation d'un jeu de donnée pour l'ex
dta<-data.frame(c1=1:10,
                c2=c(1:9,1000),
                c3=c(1:9,"A"),
                c4=seq.POSIXt(as.POSIXct("2019-01-01"),as.POSIXct("2019-01-10"),"days"),
                c5=c(as.character(seq.POSIXt(as.POSIXct("2019-01-01"),as.POSIXct("2019-01-09"),"days")),"2019-01-35"),
                c6=LETTERS[1:10],stringsAsFactors = F)

#test des valeurs numeriques
test_num<-function(x){
  isnum<-tryCatch(as.numeric(x),warning =function(w) isnum=FALSE)
  return(!all(isnum==FALSE))
}
#test des dates
test_date<-function(x){
  isdate<-tryCatch(as.POSIXct(x),error =function(w) isdate=FALSE)
  return(!all(isdate==FALSE))
}

#test de coherence des valeurs
test_valeur<-function(x){
  return(range(x)[1]>=0 & range(x)[2]<=999)
}

# test des valeurs quantitatives
test_quant<-function(x){
  return(all(grepl("^[[:alpha:]]",x)))

#on applique alors chaque test pour les colonnes voulu

sapply(1:3,function(x) test_num(dta[,x]))
[1]  TRUE  TRUE FALSE

sapply(4:5,function(x) test_date(dta[,x]))
[1]  TRUE FALSE

sapply(1:3,function(x) test_valeur(dta[,x]))
[1]  TRUE FALSE FALSE

sapply(c(1,6),function(x) test_quant(dta[,x]))
[1] FALSE  TRUE

ou si tu prefere un resultat global
all(sapply(1:3,function(x) test_num(dta[,x])),
sapply(4:5,function(x) test_date(dta[,x])),
sapply(1:3,function(x) test_valeur(dta[,x])),
sapply(c(1,6),function(x) test_quant(dta[,x])))
[1] FALSE


J'ai considéré qu'une variable était quantitative si elle commencait par une lettre mais ce test doit être ajuster en fonction de tes critéres et le test des dates doit être ajusté en fonction du format des dates si c'est un format francais, il faut remplacer

Code : Tout sélectionner

as.POSIXct(x) # par
as.POSIXct(x,format"%d/%m/%Y")
dans le test


Serge

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Re: Cohérence des données

Messagepar Montana ROQUILLET » 22 Mai 2019, 12:42

Merci beaucoup pour ton aide !
Effectivement, c'est ce type de fonction dont j'avais besoin.
Pour la date, aucun souci elle marche impeccable, par contre pour tester les variables numériques ou qualitatives, il affiche TRUE à tous les coups, même quand c'est faux..

Montana

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Cohérence des données

Messagepar Serge Rapenne » 22 Mai 2019, 12:50

Il est difficile sinon impossible de produire du code sans un exemple concret des données à traiter, tu peux constater que mon code fonctionne sur mon jeu de données exemple, c'est donc que ma compréhension de tes données n'est pas la bonne et là je n'ai pas de boule de cristal.

je renvoi encore et toujours vers viewtopic.php?f=1&t=3302

Serge


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité