Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Bonjour à tous,
J'ai créé un script pour centrer une colonne de données par une colonne de regroupement :

Pour l'instant, seule une colonne centrée est prise en compte, mais j'aimerais pouvoir en ajouter plusieurs. Auriez-vous des conseils pour rendre la formule plus dynamique ? Actuellement, je l'utilise simplement pour créer une nouvelle colonne, puis j'ajoute manuellement les colonnes supplémentaires à centrer.
Names Default To Here( 1 );
dt = current data table();
results = Column Dialog(src=ColList("Cols to be centered", Min Col(1)),trg = ColList("centered by", Min Col(1)));
for(i=1, i<= n items(eval(results[1])), i++,
ts=expr(dt << New Column( "cent col", "Numeric",Formula(Expr(Eval( results[1] )[i]) - Col Mean( Expr(Eval( results[1] )[i]), Expr(Eval( results[2] )[1]) ))));
eval(eval expr(TS));
ts=expr(dt:"cent col"n<<SET name=""></SET>
<P>Merci pour toute contribution !</P>
<BR />
<BR /><LINGO-LABS id="lingo-labs-869624" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisation et scripts</LINGO-LABEL></LINGO-LABS>Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?« Centrage des colonnes » : cette fonction est très souvent utilisée. Il existe des centaines de combinaisons pour centrer (diviser ou soustraire) et calculer la « référence » :

Vous pouvez consulter https://marketplace.jmp.com/appdetails/Normalization+GUI : cette option ajoute une interface graphique au menu JMP pour effectuer le travail à votre place. Elle fonctionne également si des lignes sont exclues.
Si vous souhaitez le configurer vous-même, l'idée de base est de manipuler les expressions étape par étape.
par exemple, utilisez Insérer dans pour ajouter un nombre dynamique de colonnes de regroupement :
For Each( {groupByCol, idx}, currentGroupCols,
Insert Into( secondArgumentDirect, Name Expr( As Column( dt, groupByCol ) ) )
);Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Voulez-vous dire que vous souhaitez ajouter plus de colonnes de regroupement ?
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
mean_expr = Expr(Col Mean());
Insert Into(mean_expr, NameExpr(src));
For Each({trg}, trgs,
colname = colname || " " || (trg << get name);
Insert Into(mean_expr, NameExpr(trg));
);
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(mean_expr),
));
);
En option, vous pouvez également laisser JMP faire davantage de cela en utilisant la nouvelle colonne de formule et en modifiant les noms après
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
res = dt << New Formula Column(
Operation(Category("Distributional"), "Center"),
Columns(srcs),
Group By(trgs)
);Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Merci @hogi . Je vais devoir ajouter ce module complémentaire.
Ah "Insérer dans", cela semble être le ticket (comme @jthi le fait également).
Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Salut @jthi ,
Oui, il serait possible d'ajouter plus de colonnes de regroupement, et le premier script est parfait ! Merci pour votre aide !
Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Une option consiste également à utiliser Substitute pour remplacer une expression par Col Mean en utilisant la liste des colonnes dans les formules .
Voici un exemple paresseux avec vos données
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
l = Insert(trgs, Name Expr(src), 1);
f = Substitute(l, Expr(List), Expr(Col Mean()));
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(f),
));
);
Juste une remarque : je construirais la boîte de dialogue en utilisant une nouvelle fenêtre au lieu d'utiliser la boîte de dialogue de colonne, car elle offre beaucoup plus de flexibilité, même dans des cas assez simples.
Re : Comment créer une formule pouvant prendre un nombre variable de colonnes d'entrée ?Merci @jthi pour les options ajoutées.
Ouais, c'était un ancien script où je n'étais pas passé à l'utilisation d'une nouvelle fenêtre, donc j'ai corrigé cette mauvaise habitude maintenant !