Nueva fórmula de columna con JSLEstoy tratando de agregar una nueva fórmula de columna a una tabla basada en la entrada del usuario. La entrada puede ser un valor único o una selección de columna.
He estado probando un par de métodos, pero no pude conseguir uno que pudiera manejar esto indistintamente.
Script de muestra que probé a continuación.
Idealmente, puedo mantener la misma expresión "newcolexpr", independientemente de la entrada. Esto se debe principalmente a que estoy tratando de implementar una columna de fórmula personalizada que requiere muchas entradas (es decir,> 8 entradas)
Agradezco la ayuda.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//when selection is a single value
//desired outcome: a new column "Test" with formula (1*5)
selection = {1};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));
//when selection is a column (e.g. "height")
//desired outcome: a new column "Test" with formula ("height"*5)
selection = {"height"};
newcolexpr = expr(
dt << new column("Test", formula(expr(selection[1])*5))
);
eval(eval expr(newcolexpr));La personalización en masaIngeniería de Calidad y ProcesosRe: Nueva fórmula de columna con JSLLo siento por la respuesta tardía. Gracias @jthi !
Descubrí que lo siguiente funciona para lo que quiero hacer:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = expr(
dt << new column("Testing",formula(t1+t2+3))
);
Selection1 = {1,5};
if(Selection1[1] == 1,
Substitute into(new_col_expr,
expr(t1),
Selection1[2]
),
Selection1[1] == 0,
Substitute into(new_col_expr,
expr(t1),
Nameexpr(ascolumn(Selection1[2]))
)
);
Selection2 = {0,"weight"};
if(Selection2[1] == 1,
Substitute into(new_col_expr,
expr(t2),
Selection1[2]
),
Selection2[1] == 0,
Substitute into(new_col_expr,
expr(t2),
Nameexpr(ascolumn(Selection2[2]))
)
);
eval(evalexpr(new_col_expr))Sin embargo, gracias por toda la referencia anterior. Ellos ayudaron.
¡Feliz año nuevo!
Re: Nueva fórmula de columna con JSLLos enfoques sobre cómo abordar esto dependen mucho de las variables, entradas y fórmulas que tenga.
Otro ejemplo:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
formula_expr = Expr(Expr(dt << New Column("Test", Numeric, Formula(placeholder*5))));
selection = {1};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
selection = {:height};
Eval(Substitute(formula_expr, Expr(placeholder), selection[1]));
formula_expr2 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Sum(placeholder)))));
selection = {1,3};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
selection = {:height, :weight};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
formula_expr3 = Expr(Expr(dt << New Column("Test", Numeric, Formula(Col Sum(placeholder)))));
selection = {:height, :age, :sex};
Eval(Substitute(formula_expr2, Expr(placeholder), selection));
Algunos enlaces:
Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Usar lista de columnas en fórmulas
¿Puedes construir esto sin escribir expresión como una cadena?
Re: Nueva fórmula de columna con JSLEy @jthi Gracias por la respuesta. Yo también estaba pensando así, pero ¿qué pasa si tengo más de 1 variable para considerar en la fórmula? ¿Anidado si será la única solución allí (realmente estoy tratando de evitar eso)?
Me pregunto si la sintaxis puede manejar una variable dentro de expr() para que pueda asignar un número o NameExpr(asColumn()) según el tipo de entrada antes de sustituirlo en la expresión.
Re: Nueva fórmula de columna con JSLLo más probable es que tenga que verificar la entrada y luego crear una columna basada en eso (puede verificar dentro de la fórmula Expr in, pero es más claro de esta manera). A continuación se muestra una opción:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new_col_expr = Expr(
cur_sel = selection[1];
show(cur_sel);
If(IsNumber(cur_sel),
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(cur_sel)*5))));
,
Eval(EvalExpr(dt << New Column("Test", Numeric, Formula(Expr(NameExpr(AsColumn(cur_sel)))*5))));
);
);
selection = {1};
new_col_expr;
selection = {"height"};
new_col_expr;