Crear o agregar nuevas columnas usando veriblesHola chicos, me disculpo por el título confuso. No estaba seguro de cómo expresarlo.
Mi pregunta es: tengo un código en el que estoy agregando nuevas columnas usando condiciones largas.
Las condiciones son las mismas para todas las columnas, excepto un parámetro que cambia.
¿Hay alguna manera, en lugar de escribir cada vez el código completo y las condiciones con el nuevo valor del parámetro, crear una plantilla (como una función) que utilizaré como variable en lugar del parámetro al que enviaré cada vez el valor necesario para las condiciones de la nueva columna?
Automatización y scriptingAnálisis y modelado de datos básicosRe: Crear/agregar nuevas columnas usando veriblesPuedes usar funciones o expresiones para algo como esto.
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#ww339382
https://www.jmp.com/support/help/en/18.0/#page/jmp/advanced-functions.shtml#
Insertar una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Re: Crear/agregar nuevas columnas usando veriblesNo es necesario escribir ningún código.
Desde JMP 18 esto es súper fácil: solo eche un vistazo a Discusiones/Fórmula/ - función n.° 3.
En breve:
Seleccione las columnas que desea utilizar como entrada, luego haga clic derecho en el encabezado de una columna y haga clic en
nueva columna de fórmula / 
Como último paso, ingrese su fórmula y haga clic en 
[Seleccioné 128 columnas, así que cree 128 .
Si seleccionaste N columnas, se crearán N columnas : )
Re: Crear/agregar nuevas columnas usando veriblesSi desea utilizar exactamente la misma fórmula una y otra vez a través del menú contextual de nueva fórmula, puede crear su propia "función personalizada" y habilitar la opción Transformar categoría para que aparezca en el menú.
Después de reiniciar, el código debe ejecutarse nuevamente, así que inclúyalo en un complemento o en sus scripts de inicio.
Names Default To Here( 1 );
myAdd =
New Custom Function(
"custom",
"Add",
Function( {x, y = 1},
x + y - 1
)
);
myAdd << Transform Category( 1 );del índice de scripts:

Pero este enfoque es muy "estático". Para poder cambiar un parámetro, hay que votar aquí:
Nuevo menú de columnas de fórmulas: mini GUI definidas por el usuario
Re: Crear/agregar nuevas columnas usando veriblesA continuación se muestra un ejemplo de una función que sumará un número. Le faltan algunas comprobaciones para ser una "buena" función, pero proporciona la idea necesaria de que los valores que pueden cambiar (nombre de la columna y número a sumar en este caso) deben evaluarse (consulte Insertar una expresión en otra... que mencioné anteriormente).
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(EvalExpr(
dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
Expr(NameExpr(AsColumn(dt, colname))) + Expr(num_to_add)
));
));
return(new_col);
);
col1 = add_num_to_col(dt, "height", 10);
col2 = add_num_to_col(dt, "height", 20);
col3 = add_num_to_col(dt, "weight", 5);
Write();
A veces, usar Eval(Substitute()) es una solución más clara y fácil de entender y podría verse así
add_num_to_col = Function({dt, colname, num_to_add}, {Default Local},
new_col = Eval(Substitute(
Expr(dt << New Column(colname || " add " || char(num_to_add), Numeric, Continuous, Formula(
_colname_ + _num_to_add_
))),
Expr(_colname_), Name Expr(AsColumn(dt, colname)),
Expr(_num_to_add_), num_to_add
));
return(new_col);
);Re: Crear/agregar nuevas columnas usando veriblesUna combinación de los enfoques anteriores, con un pequeño cambio :
- crear una función personalizada *)
- agregarlo a una categoría de fórmula
- Haga clic derecho en el encabezado de una columna y haga clic en Nueva columna de fórmula /

- Utilice la nueva fórmula
- ... e ingrese el parámetro manualmente:

*)
Add Custom Functions(
New Custom Function(
"custom",
"add++",
Function( {column, num_to_add},
{Default Local},
column,
num_to_add
),
<<FORMULA category=""></FORMULA>The benefit: the user can enter specific parameters for every new column.
The disadvantage: no <STRONG><EM>lote</EM> </STRONG>mode like in the previous posts.<BR /><BR />kind of disadvantage: JMP doesn't <EM>resolver/reemplazar</EM> the formula, it keeps it as <FONT face="courier new,courier">añadir++(...)</FONT>.<BR /> To keep it alive the formula definition has to be executed again after a restart of JMP - and maybe: shared with colleagues.
Re: Crear/agregar nuevas columnas usando veriblesGracias a todos por la ayuda.
Tengo un nuevo problema relacionado que quizás alguien pueda explicarme.
Utilicé el siguiente método para eliminar filas sin datos en una columna específica:
dt << seleccionar donde( Falta( Columna( dt,col_name )[fila()] ));
*Como resultado, elimina las filas correctas, pero al mismo tiempo elimina los valores de la columna. ¿Alguien puede señalarme el error?
Adjunto aquí el propio script:
Re: Crear/agregar nuevas columnas usando veriblesNames Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
New column(col_name); // maybe another column with the same name?
new_col = New column(col_name, Formula(if(:height>60,1 )));
// get the correct column name - uncomment to make it work
//col_name = new_col << get name();
dt << select where( Is missing( Column( dt,col_name )[row()] ));
wait(1);
dt << delete rows;
Re: Crear/agregar nuevas columnas usando veriblesNo recomiendo usar cadenas para hacer referencia a columnas. Sucede con tanta frecuencia que la columna real se crea agregando un "2" y la cadena llevará a otra columna.
Cuando generas la columna, obtienes un identificador para la columna. Solo tienes que utilizar este identificador y te guiará a la columna correcta:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
dt << select where( Is missing( new_Col[] ));
Re: Crear/agregar nuevas columnas usando veriblesTampoco me gusta el [] para reemplazar la columna Column (col_name) con el valor actual As column(col_name) .
:col puede hacer ambas cosas, y aprendí de @jthi :
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name="x";
new_col = New column(col_name, Formula(if(:height>60,1 )));
myCol = Name Expr(As Column(new_col)); // very cool trick (c) Jarmo
Show(Name Expr(myCol));
dt << select where( Is missing( myCol ));