Estoy tratando de escribir un script para sumar columnas específicas si están presentes en la tabla de datos. Llamémoslos Col A, Col B, Col C, Col D. El problema es que la tabla de datos no siempre tiene las cuatro columnas, lo que genera un error. Me gustaría escribir un script que pueda agregar Col A, Col B, Col C y Col D que están presentes en la tabla de datos. Obviamente, podría actualizar el código para los que están presentes cada vez, pero estoy tratando de encontrar una forma automatizada que pueda manejar las diversas tablas de datos sin errores.
¡Gracias!
Hola @GradosDeGen19 ,
¿Es esto similar a lo que estás buscando?
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 )
)
);
Editar: dt cambiado << Obtener nombres de columna; to dt << Obtener nombres de columna (cadena); Esto hace que los nombres de las columnas devuelvan cada uno una cadena, que es la lista de columnas definidas por el usuario.Mi culpa por no haberlo captado inicialmente.
A continuación se muestran algunos ejemplos de lo que podría hacer. Hay formas más simples (más fáciles de entender) de filtrar las columnas encontradas, pero las matrices asociativas son buenas para este tipo de caso de 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));
))
));
Primero calculo qué columnas existen en la tabla de datos de la lista deseada usando arreglos asociativos e intersección . Entonces hay dos opciones, usando << establecer cada valor y subíndice de la tabla de datos para calcular la expresión de fórmula de suma o construcción y usando eso