existe-t-il un moyen de réévaluer automatiquement le type de données ?Si j'ai une table de données que je divise en différentes colonnes, toutes les colonnes sortent avec un type de données "Caractère" comme prévu.
Maintenant, existe-t-il un moyen d'écrire un script JSL pour réévaluer automatiquement si le type de données doit être numérique ou caractère ? S'il trouve que l'entrée de données est numérique, changer le type de données en numérique ?
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Une approche serait de compter le nombre de valeurs manquantes, de saisir une liste des valeurs, de forcer la colonne à être numérique, puis de compter à nouveau le nombre de valeurs manquantes. Si le nombre de manquants est le même avant et après, vous avez une colonne numérique. Si ce n'est pas le cas, modifiez-le et remplacez les valeurs par la copie.
Là où cela échouerait, c'est lorsqu'une valeur non numérique, telle que NA, apparaît dans une colonne numérique.
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Don m'a battu pour trouver une solution, mais une autre option serait d'utiliser une expression régulière pour déterminer si chaque colonne ne contient que des chiffres et des points (point décimal). L'exemple ci-dessous prend chaque colonne, concatène toutes ses valeurs dans une grande chaîne, puis vérifie si cette chaîne contient des caractères qui ne sont pas un nombre ou un point décimal ( [^0-9\.] ). S'il ne trouve que des nombres et des points décimaux dans toute la colonne (c'est-à-dire que Contient l'élément est évalué à zéro), il définit le type de données sur numérique.
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Si vous n'avez pas besoin d'une solution automatisée, il existe une option de triangle rouge Parse as Numbers dans Recode. Il remplace toute entrée non numérique (comme NA) par une valeur manquante.
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Un problème potentiel avec cette approche est qu'elle ne prend pas en charge la notation scientifique. Modifier le Regex pour accepter la notation scientifique et les négatifs, tout en rejetant des choses comme les téléphones et les numéros de sécurité sociale, le rend considérablement (hah ! jeu de mots !) plus complexe.
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?C'est l'approche que je recommande. En fonction des données susceptibles d'être rencontrées, j'ai également procédé comme suit :
1) Utilisez uniquement les k premières lignes de chaque colonne pour prendre la décision, pour augmenter l'efficacité.
2) Autoriser un certain pourcentage (ajuster au besoin) de manquants dans une colonne donnée (ou son sous-ensemble). En dessous de ce seuil, convertissez quand même en numérique.
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Outre les complications déjà mentionnées, la solution considère également les virgules comme espace réservé décimal ou comme séparateurs numériques pour les milliers. De cette façon, il pourrait également s'agir d'une solution plus internationale.
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Bon point (et jeu de mots), Brady. Cette solution regex fonctionne pour les données d'exemple bien comportées mais ne se généraliserait pas à toutes les données possibles. J'imagine qu'il y a un maître regex qui pourrait faire le travail mais qui pourrait être une corvée pour le trouver. Alternativement, on pourrait parcourir chaque ligne individuelle dans une colonne avec une ou plusieurs vérifications Contient l'élément plus simples ; par exemple, on pourrait autoriser un tiret initial (pour les nombres négatifs) mais rejeter tout ce qui contient des tirets non initiaux, puis un autre pourrait vérifier si la ligne est conforme à la notation scientifique. Si toutes les vérifications réussissent pour toutes les lignes d'une colonne, modifiez le type de données. Comme vous le dites, "significativement" plus complexe.
Re : existe-t-il un moyen de réévaluer automatiquement le type de données ?Je suis un peu en retard pour la fête, mais une méthode "trompeuse" consiste à exporter le fichier au format csv, puis à le réimporter, où JMP déterminera automatiquement les types de colonnes lors de l'ouverture. Cela suppose cependant que vous n'avez pas besoin d'enregistrer de scripts de table ou de propriétés de colonne. Voici un scénario.
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");