Script JSL para filtrar filas enteras donde una columna en particular contiene valores faltantesEstimada comunidad,
Soy un usuario principiante y me gustaría solicitar su amable ayuda con el siguiente código. El argumento de la función "is missing" parece incorrecto.
Me gustaría que el script mostrara una tabla en la que se mostraran las filas que contienen valores en determinados rangos. Además, se excluirían las filas con celdas vacías en las dos columnas utilizadas para el filtrado.
Aquí va el código:
dt = Current Data Table(); // Assumes you have a data table already opened
// Convert Column1 to numeric data type
dt << As Numeric("Temperatur");
// Convert Column2 to numeric data type
dt << As Numeric("Menge");
// Create the conditions to filter the rows
condition1 = Column(dt, "Temperatur") << Get Values() > 25;
condition2 = Column(dt, "Menge") << Get Values() > 0;
// Create a condition to remove empty cells
condition3 = Any(Is Missing(dt << Get Values("Temperatur"))) == 0 | Any(Is Missing(dt << Get Values("Menge"))) == 0;
// Apply all three conditions to filter the data table
filtered_dt = dt << Select Where(condition1 & condition2 & condition3);
// Show the filtered data table
filtered_dt << Show();
Muchas gracias de antemano por cualquier consulta. Estoy usando la versión 17 de JMP.
Miguel
Automatización y scriptingRe: Script JSL para filtrar filas enteras donde una columna en particular contiene valores faltantesMuchas gracias Jthi, con tu ayuda lo logré funcionar!
Re: Script JSL para filtrar filas enteras donde una columna en particular contiene valores faltantesMuchas gracias Hogi, con tu ayuda lo logré funcionar!
Re: Script JSL para filtrar filas enteras donde una columna en particular contiene valores faltantesEstás mezclando la comparación de matrices y la selección de una tabla de datos, en este caso lo más probable es que solo quieras usar << Select Where o << Get Rows Where y no << Get Values (es posible que quieras usar << Get Rows Where en lugar de << Select Where pero esto depende de lo que desees hacer).
Puede combinar las condiciones directamente en una única declaración Select Where (si desea separarlas, lo haría con comentarios a menos que desee reutilizar exactamente las mismas declaraciones)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
dt << Select Where((:height > 60) & (:weight > 90));
selrows = dt << get selected rows; // to get a matrix of selected row numbers
r = dt << Get Rows Where((:height > 60) & (:weight > 90));
y comprobar esos valores faltantes no es necesario en este caso
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
r1 = dt << Get Rows Where((:height > 60) & (:weight > 90) & (!IsMissing(:height) | !Is Missing(:weight)));
r2 = dt << Get Rows Where((:height > 60) & (:weight > 90));
r1 == r2;Re: Script JSL para filtrar filas enteras donde una columna en particular contiene valores faltantesHola Mical.
Lo bueno de JMP es que no necesitas saber nada sobre scripts, simplemente puedes usar la GUI y tu mouse.
Luego de ejecutar los pasos, puedes ir al registro avanzado y verificar el código...
- Filas/Selección de filas/Seleccionar dónde (Ctrl + W)

- Abrir vista de datos para las filas seleccionadas:

- comprobar el registro:

Jmp entiende lo que quieres e incluso combina los dos pasos en una sola línea de código:

Si desea construir el comando por su cuenta, puede definir algunas cadenas, concatenarlas y luego analizar y evaluar el código final:
cond1 = "Is Missing( :age )";
cond2 = ":age > 16";
Eval(Parse("dt << Select where( "|| cond1 || " | " || cond2 || " ) << Data View;"))
Mi sugerencia: invertir algo de tiempo para aprender y comprender el manejo de expresiones.
Un gran tutorial: Cómo usar JSL para desarrollar aplicaciones eficientes y robustas (EU 2018 415) de @joseph_morgan
Verás, en realidad es bastante similar a tu enfoque:
almacene algunas condiciones como "símbolos" JSL condición 1, condición 2... luego úselas para construir su expresión final y evaluarla.
Con algunas correcciones de código y Expr() y Name Expr() aquí y allá (para evitar que Jmp evalúe las condiciones antes de que puedan insertarse en la línea final de código), el código debería verse así:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
condition 1 = Expr(Is Missing( :age ));
condition 2 = Expr(:age > 16 );
combined condition=Expr(or());
Insert into(combined condition, Name Expr(condition1));
Insert into(combined condition, Name Expr(condition2));
Eval(Substitute(dt << Select where( _cond_ ) << Data View),
Expr(_cond_),Name Expr(combined condition)));