J'essaie d'écrire un script pour additionner des colonnes spécifiques si elles sont présentes dans la table de données. Appelons-les Col A, Col B, Col C, Col D. Le problème est que la table de données n'a pas toujours les quatre colonnes, ce qui entraîne une erreur. Je voudrais écrire un script qui peut ajouter Col A, Col B, Col C et Col D qui sont présents dans la table de données. Évidemment, je pourrais simplement mettre à jour le code pour ceux présents à chaque fois, mais j'essaie de trouver un moyen automatisé capable de gérer les différentes tables de données sans erreur.
Merci!
Bonjour @DegreesOfGen19 ,
Est-ce similaire à ce que vous recherchez ?
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 )
)
);
Modifier : modifié dt << Obtenir les noms de colonne ; à dt << Obtenir les noms de colonne (chaîne); Cela fait des noms de colonne renvoyés chacun une chaîne, ce qui correspond à la liste des colonnes définies par l'utilisateur.Mon mauvais pour ne pas attraper cela au départ.
Voici quelques exemples de ce que vous pourriez faire. Il existe des moyens plus simples (plus faciles à comprendre) de filtrer les colonnes trouvées, mais les tableaux associatifs conviennent à ce type de cas d'utilisation.
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));
))
));
Je calcule d'abord quelles colonnes existent dans la table de données à partir de la liste recherchée en utilisant tableaux associatifs et intersection . Ensuite, il y a deux options, en utilisant << définir chaque valeur et abonnement à une table de données pour calculer la somme ou l'expression de la formule de construction et en utilisant ce