Sto cercando di scrivere uno script per sommare colonne specifiche se sono presenti nella tabella dei dati. Chiamiamole Col A, Col B, Col C, Col D. Il problema è che la tabella dei dati non ha sempre tutte e quattro le colonne, il che si traduce in un errore. Vorrei scrivere uno script in grado di aggiungere Col A, Col B, Col C e Col D presenti nella tabella dei dati. Ovviamente potrei semplicemente aggiornare ogni volta il codice per quelli presenti ma sto cercando di trovare un modo automatizzato che possa gestire le varie tabelle di dati senza errori.
Grazie!
Ciao @DegreesOfGen19 ,
È simile a quello che stai cercando?
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 )
)
);
Modifica: modificato dt << Ottieni i nomi delle colonne; to dt << Ottieni i nomi delle colonne( string ); Ciò rende i nomi di colonna restituiti ciascuno una stringa, ovvero l'elenco delle colonne definite dall'utente.Colpa mia per non averlo capito inizialmente.
Di seguito sono riportati alcuni esempi di ciò che potresti fare. Esistono modi più semplici (più facili da capire) per filtrare le colonne trovate, ma gli array associativi sono utili per questo tipo di caso d'uso
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));
))
));
Per prima cosa calcolo quali colonne esistono nella tabella dati dall'elenco ricercato utilizzando array associativi e si intersecano . Quindi ci sono due opzioni, usando << imposta ciascun valore e sottoscrizione della tabella di dati per calcolare la somma o l'espressione della formula di costruzione e l'utilizzo Quello