Ich versuche, ein Skript zu schreiben, um bestimmte Spalten zu summieren, wenn sie in der Datentabelle vorhanden sind. Nennen wir sie Col A, Col B, Col C, Col D. Das Problem ist, dass die Datentabelle nicht immer alle vier Spalten enthält, was zu einem Fehler führt. Ich möchte ein Skript schreiben, das Col A, Col B, Col C und Col D hinzufügen kann, die in der Datentabelle vorhanden sind. Natürlich könnte ich den Code für die vorhandenen jedes Mal aktualisieren, aber ich versuche, einen automatisierten Weg zu finden, der die verschiedenen Datentabellen ohne Fehler verarbeiten kann.
Danke!
Hallo @DegreesOfGen19 ,
Ist dies dem, was Sie suchen, ähnlich?
Names default to here(1);
dt = current data table();
// your columns of interest
col_list = { "Col A", "Col B", "Col C", "Col D" };
// creates list of column names from the target data table
dt_col_list = dt << Get column names( string );
for( i = 1, i <= N Items( col_list ), i++,
if( contains( dt_col_list, col_list[i] ),
mysum = colsum( column( col_list[i] ) );
show( mysum )
)
);
Bearbeiten: geändert dt << Spaltennamen abrufen; to dt << Hole Spaltennamen( string ); Dadurch werden die zurückgegebenen Spaltennamen jeweils zu einer Zeichenfolge, was der Liste der benutzerdefinierten Spalten entspricht.Mein Fehler, dass ich das anfangs nicht verstanden habe.
Nachfolgend finden Sie einige Beispiele, was Sie tun könnten. Es gibt einfachere (leichter zu verstehende) Möglichkeiten, die gefundenen Spalten zu filtern, aber assoziative Arrays sind gut für diese Art von Anwendungsfall
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(1),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Set Values([1,2,3,.])),
New Column("Column 2", Numeric, "Continuous", Set Values([2,3,4,5])),
New Column("Column 3", Numeric, "Continuous", Set Values([3,4,5,.]))
);
col_list = {"Column 1", "Column 2", "Column 3", "Column 4"};
table_col_list = dt << Get Column Names("String");
// keep only columns which are found from data table
cols_to_keep = Associative Array(col_list);
cols_to_keep << Intersect(Associative Array(table_col_list));
cols_to_keep = cols_to_keep << get keys;
// if you don't need a formula, data table subscripting is quite easy solution
dt << New Column("SumForCols", Numeric, Continuous, << Set Each Value(
Sum(dt[Row(), cols_to_keep]);
));
// if you do need a formula, you can build one with expressions (requires JMP16+ due to For Each usage)
// https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
f_expr = Expr(Sum());
For Each({col_name}, cols_to_keep,
Insert Into(f_expr, Name Expr(AsColumn(col_name)));
);
show(name expr(f_expr));
Eval(EvalExpr(
dt << New Column("SumForColsFormula", Numeric, Continuous, Formula(
Expr(name expr(f_expr));
))
));
Zuerst berechne ich, welche Spalten in der Datentabelle aus der gesuchten Liste vorhanden sind, indem ich benutze assoziative Arrays und schneiden . Dann gibt es zwei Möglichkeiten, mit << jeden Wert einstellen und Subskription von Datentabellen um den Summen- oder Aufbauformelausdruck zu berechnen und zu verwenden Das