For Loop n'évalue pas la formule correctement.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'essaie de créer de nouvelles colonnes dans une table de données, chaque nouvelle colonne est le score Z d'une colonne existante. Voici ce que j'ai
Colnames_1st = dt_zscore3 << Obtenir les noms de colonne ();
nlist = N Items (Colnames_1st);
pour (i = 5, i <= 10, i ++,
var1 = Column (Colnames_1st )
moyenne = moyenne de Col (var1);
stdev = Col Std Dev (var1);
namevar = char (Colnames_1st )
Nouvelle colonne ("Zscore" || noms,
Numérique, continu,
Format ("Meilleur", 12),
Formule (((((var1 []) - moyenne) / stdev)));
)
Le code crée les 6 nouvelles colonnes et les nomme correctement.
Mais quand il va remplir les valeurs dans toutes les colonnes, il ne le fait pas correctement.
Toutes les colonnes se retrouvent avec la même valeur dans chaque ligne. Il me semble
crée les colonnes, mais attend ensuite jusqu'à ce que la boucle for soit terminée pour calculer la
les valeurs qui vont dans chaque ligne dans toutes les colonnes, de sorte qu'il utilise la dernière valeur de tous
les variables pour toutes les colonnes, au lieu de calculer la formule pour chaque
colonne en utilisant les valeurs qui devraient être utilisées par cette colonne.
Je suis vraiment coincé. J'ai essayé toutes sortes de choses mais je ne peux pas surmonter cet obstacle.
Toute aide serait très appréciée.
Re: For Loop n'évalue pas la formule correctement.Je pense qu'il pourrait y avoir un problème avec votre solution. Cela peut fonctionner lorsque les colonnes sont créées, mais pas dans une autre session ou si des données sont modifiées ou ajoutées dans les colonnes source.
Si vous regardez les formules dans les nouvelles colonnes, je suppose que cela ressemblera à "(var1 [] - mean) / stdev". Ces noms de variables n'ont de sens que dans le contexte de script actuel (ou même dans une itération de boucle for spécifique. Si les variables sont redéfinies ou effacées, les formules ne fonctionneront pas correctement.
Les formules doivent être entrées littéralement car les variables de l'argument Formula () ne sont apparemment pas évaluées mais prises littéralement. Si des variables doivent être utilisées, par exemple dans une boucle for, cela peut être obtenu en manipulant des chaînes ou des expressions.
Exemple utilisant evalexpr () pour évaluer des expressions dans une expression avant de l’évaluer:
dt = Ouvrir ( "$ SAMPLE_DATA / Big Class.jmp" ) ;
n = N Col ( dt ) ;
Pour ( je = 4 , je <= n , je ++,
var1 = Colonne ( je ) ;
Eval (
Eval Expr (
dt << Nouvelle colonne ( "Zscore" || ( var1 << obtenir un nom ) ,
Numérique ,
Continu ,
Formule ( Col Standardiser ( Expr ( var1 ) ) )
)
)
) ;
) ;
Re: For Loop n'évalue pas la formule correctement.Je pense avoir enfin trouvé une solution.
J'ai le sentiment que mon problème réside en quelque sorte dans la définition de variables locales / globales, mais peu importe ce que j'ai essayé, je ne pouvais pas trouver comment le résoudre de cette manière.
Au lieu de cela j'ai ajouté la ligne
dt_zscore3 << Exécuter des formules
et maintenant il le fait correctement.
Colnames_1st = dt_zscore3 << Obtenir les noms de colonne ();
nlist = N Items (Colnames_1st);
pour (i = 5, i <= nlist, i ++,
Noms par défaut ici (1);
var1 = Column (Colnames_1st )
// var1 = Column (Colnames_1st )
moyenne = moyenne de Col (var1);
stdev = Col Std Dev (var1);
namevar = char (Colnames_1st )
Nouvelle colonne ("Zscore" || noms,
Numérique, continu,
Format ("Meilleur", 12),
Formule (((((var1 []) - moyenne) / stdev)));
dt_zscore3 << Exécuter des formules
)
Ce n'est peut-être pas élégant ni la manière la plus correcte de le faire, mais je le publie au cas où quelqu'un le jugerait utile.