Come creare una formula che possa accettare un numero variabile di colonne di input?Ciao a tutti,
Ho creato uno script per centrare una colonna di dati in base a una colonna di raggruppamento:

Al momento rispetta solo una colonna centrata, ma vorrei poterne inserire più di una. Qualche consiglio su come rendere la formula più dinamica? Al momento la uso solo per creare una nuova colonna, poi aggiungo manualmente le colonne da centrare.
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>Grazie per ogni contributo!</P>
<BR />
<BR /><LINGO-LABS id="lingo-labs-869624" slang="en-US" mode="CREATE"><LINGO-LABEL>Automazione e scripting</LINGO-LABEL></LINGO-LABS>R: Come creare una formula che possa accettare un numero variabile di colonne di input?"centrare le colonne" - questo è necessario molto spesso. Esistono centinaia di combinazioni per centrare (dividere o sottrarre) e calcolare il "riferimento":

Puoi dare un'occhiata a https://marketplace.jmp.com/appdetails/Normalization+GUI : aggiunge un'interfaccia grafica al menu JMP per fare questo lavoro al posto tuo. Funziona anche se le righe sono escluse.
Se si desidera configurarlo autonomamente, l'idea di base è quella di manipolare le espressioni passo dopo passo.
ad esempio utilizzare Inserisci in per aggiungere un numero dinamico di colonne di raggruppamento:
For Each( {groupByCol, idx}, currentGroupCols,
Insert Into( secondArgumentDirect, Name Expr( As Column( dt, groupByCol ) ) )
);R: Come creare una formula che possa accettare un numero variabile di colonne di input?Vuoi dire che vuoi aggiungere più colonne di raggruppamento?
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),
));
);
Facoltativamente, puoi anche lasciare che JMP faccia di più in questo senso utilizzando Nuova colonna formula e modificando i nomi dopo
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)
);R: Come creare una formula che possa accettare un numero variabile di colonne di input?Grazie @hogi . Dovrò aggiungere quel componente aggiuntivo.
Ah "Inserisci in", sembra essere il biglietto giusto (dato che anche @jthi ci va dentro).
R: Come creare una formula che possa accettare un numero variabile di colonne di input?Ciao @jthi ,
Sì, sarebbe possibile aggiungere più colonne di raggruppamento e il primo script è perfetto! Grazie per l'aiuto!
R: Come creare una formula che possa accettare un numero variabile di colonne di input?Un'altra possibilità è quella di usare Sostituisci per sostituire un'espressione con Col Mean utilizzando l'elenco di colonne nelle formule .
Ecco un esempio pigro con i tuoi dati
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),
));
);
Solo una nota: costruirei la finestra di dialogo utilizzando Nuova finestra anziché Finestra di dialogo Colonna, poiché offre molta più flessibilità anche nei casi più semplici.
R: Come creare una formula che possa accettare un numero variabile di colonne di input?Grazie @jthi per le opzioni aggiunte.
Sì, si trattava di uno script più vecchio per il quale non ero ancora passato alla modalità Nuova finestra, quindi ora ho corretto questa cattiva abitudine!