Wie erstellt man eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Hallo zusammen,
Ich habe ein Skript erstellt, um eine Datenspalte nach einer Gruppierungsspalte zu zentrieren:

Momentan wird nur eine zentrierte Spalte berücksichtigt, ich möchte aber mehrere Spalten einfügen können. Gibt es Tipps, wie man die Formel dynamischer gestalten kann? Momentan verwende ich dies, um eine neue Spalte zu beginnen und dann manuell die zusätzlichen Spalten hinzuzufügen, nach denen zentriert werden soll.
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>Vielen Dank für jeden Beitrag!</P>
<BR />
<BR /><LINGO-LABS id="lingo-labs-869624" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisierung und Skripting</LINGO-LABEL></LINGO-LABS>Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?"Spalten zentrieren" - das wird sehr oft benötigt. Es gibt Hunderte von Kombinationen, wie man zentriert (dividiert oder subtrahiert) und wie man die "Referenz" berechnet:

Sie können einen Blick auf https://marketplace.jmp.com/appdetails/Normalization+GUI werfen – dort wird dem JMP-Menü eine GUI hinzugefügt, die die Arbeit für Sie erledigt. Dies funktioniert auch, wenn Zeilen ausgeschlossen sind.
Wenn Sie es selbst einrichten möchten, besteht die Grundidee darin, die Ausdrücke Schritt für Schritt zu manipulieren.
Verwenden Sie beispielsweise „Einfügen in“, um eine dynamische Anzahl von Gruppierungsspalten hinzuzufügen:
For Each( {groupByCol, idx}, currentGroupCols,
Insert Into( secondArgumentDirect, Name Expr( As Column( dt, groupByCol ) ) )
);Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Meinen Sie, dass Sie weitere Gruppierungsspalten hinzufügen möchten?
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),
));
);
Optional können Sie JMP auch mehr davon erledigen lassen, indem Sie Neue Formelspalte verwenden und die Namen danach ändern
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)
);Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Danke @hogi . Ich muss mir das Add-In holen.
Ah, „Einfügen in“, das scheint das Problem zu sein (da @jthi auch hineingeht).
Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Hey @jthi ,
Ja, es könnten weitere Gruppierungsspalten hinzugefügt werden, und das erste Skript ist perfekt! Danke für die Hilfe!
Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Eine Möglichkeit besteht auch darin, mithilfe von „Substitute“ einige Ausdrücke durch „Col Mean Using list of columns in formulas“ zu ersetzen.
Hier ist ein einfaches Beispiel mit Ihren Daten
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),
));
);
Nur eine Anmerkung: Ich würde den Dialog mithilfe von „Neues Fenster“ statt mithilfe von „Spaltendialog“ erstellen, da dies selbst in relativ einfachen Fällen viel mehr Flexibilität bietet.
Betreff: Wie erstelle ich eine Formel, die eine variable Anzahl von Eingabespalten aufnehmen kann?Danke @jthi für die hinzugefügten Optionen.
Ja, das war ein älteres Skript, bei dem ich nicht auf die Verwendung eines neuen Fensters umgestellt hatte, also habe ich diese schlechte Angewohnheit jetzt behoben!