Seleccionar celdas con datos vacíosTengo una tabla que se parece a la siguiente tabla:
| operador |
tipo m |
descripción |
descripción 2 |
M1 |
M2 |
M3 |
M4 |
M5 |
M6 |
| 415 |
Nxyz |
Un caliente |
limpieza en caliente 1 |
415 |
415 |
415 |
415 |
415 |
415 |
| 615 |
Nxyz |
B frío |
limpieza en frio 1 |
615 |
615 |
615 |
|
615 |
615 |
| 815 |
Nxyz |
Un caliente |
limpieza en caliente 2 |
815 |
815 |
815 |
815 |
815 |
815 |
| 1015 |
Nxyz |
B frío |
limpieza en frio 2 |
1015 |
|
1015 |
1015 |
1015 |
1015 |
| 1215 |
Nxyz |
Un caliente |
limpieza en caliente 1 |
1215 |
1215 |
1215 |
1215 |
1215 |
1215 |
| 1415 |
Nxyz |
B frío |
limpieza en frio 1 |
1415 |
1415 |
1415 |
1415 |
1415 |
|
| 1615 |
Nxyz |
Un caliente |
limpieza en caliente 2 |
1615 |
1615 |
1615 |
1615 |
1615 |
1615 |
| 1815 |
Nxyz |
B frío |
limpieza en frio 2 |
1815 |
1815 |
1815 |
|
|
1815 |
Quiero seleccionar solo las filas que están vacías. Dado que las columnas M1-M6 pueden variar cada vez que extraigo los datos, no puedo usar los nombres de las columnas en el script JSL. Estoy intentando usar un bucle FOR a continuación para seleccionar las filas de datos vacíos, pero esto solo selecciona las filas donde la última celda está vacía.
dt = Current Data Table();
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
dt <<SELECT where=""></SELECT>
Finalmente quiero que la tabla de salida se vea como la siguiente
| operador |
tipo m |
descripción |
descripción 2 |
Máquina |
| 615 |
Nxyz |
B frío |
limpieza en frio 1 |
M4 |
| 1015 |
Nxyz |
B frío |
limpieza en frio 2 |
M2 |
| 1415 |
Nxyz |
B frío |
limpieza en frio 1 |
M6 |
| 1815 |
Nxyz |
B frío |
limpieza en frio 2 |
M4 |
| 1815 |
Nxyz |
B frío |
limpieza en frio 2 |
M5 |
El gran truco para esto es hacerlo sin codificar los nombres de las columnas (M1, M2, etc.) ya que van a cambiar.
Algunas ideas
Automatización y secuencias de comandosRe: Seleccionar celdas con datos vacíos<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Gracias a todos... Todo funcionó excepto Loc Nonmissing... Sólo tengo JMP9 en este momento (demasiado vago para actualizar) y esa característica no funciona en JMP9... Todavía estoy un novato en JSL.....Gracias de nuevo
Re: Seleccionar celdas con datos vacíosMS eso es aún más ingenioso: ¡ahora veamos cómo hacerlo en 0 líneas de código!Ja, ja, simplemente demuestra que hay varias formas de hacer lo mismo en JSL.
Re: Seleccionar celdas con datos vacíosSi estoy leyendo tu mensaje correctamente, creo que en realidad tienes dos preguntas.
- Cómo encontrar las filas que faltan en un conjunto determinado de columnas.
- Cómo hacer que su código no dependa de los nombres de esas columnas y de cuántas hay.
No es sorprendente que haya muchas maneras diferentes de hacer 1. PMroz , EM y Craige@JMP Te he dado algunas opciones allí.
Agregaré uno más. Podrías usar el Patrón de datos faltantes utilidad para encontrarlos.
dt = Open( "$SAMPLE_DATA\Cities.jmp" );
//delete some columns from this table to make it fit your example
dt << delete columns( "PM10", "X", "Y" );
//change name of data table to ensure this modified version doesn't get saved
//over the sample data
dt << set name( "CitiesModified" );
//I want to use the columns starting at column 9,
//so I build a list of references to them
mycols = {};
For( i = 9, i <= N Cols( dt ), i++,
Insert Into( mycols, Column( dt, i ) )
);
mdp = Dt << Missing Data Pattern( columns( Eval( mycols ) ), Output Table( "Missing Data Pattern" ) );
//The patterns columns shows the pattern of missing values
//the Missing Data Pattern data table is sorted,
//so if there are rows with all missing data
//the last row of the Missing Data Pattern data table will be all 1s.
//The Repeat() function just builds a string of 1s for as many columns as I'm working with
If( Column( mdp, "Patterns" )[N Rows( mdp )] == Repeat( "1", N Items( mycols ) ),
//The Missing Data Pattern data table is linked to the source table so selecting a row
//in it, selects all the rows that it represents in the source table
mdp << Select Rows( N Rows( mdp ) );
//now I can delete the rows in the source table
dt << delete rows;
,
Show( "No all missing rows" )
);
Intenté mostrar cómo hacer que este código funcione para cualquier número de columnas. En este caso, como necesitaba una lista de columnas para pasar a la utilidad Patrón de datos faltantes, construí una lista basada en los números de columna.
Incluso después de haber escrito todo esto y haber mostrado cómo usar la Utilidad de patrones de datos faltantes, creo que mi solución favorita aquí sería PMroz es para usar Apilar columnas . De todos modos, realmente desea terminar con los datos apilados, por lo que hacerlo primero hace que sea más fácil simplemente seleccionar las filas que faltan en la columna apilada y eliminarlas.
dt = Open( "$SAMPLE_DATA\Cities.jmp" );
//delete some columns from this table to make it fit your example
dt << delete columns( "PM10", "X", "Y" );
//change name of data table to ensure this modified version doesn't get saved
//over the sample data
dt << set name( "CitiesModified" );
//again I need a list of columns to use in the Stack()
mycols = {};
For( i = 9, i <= N Cols( dt ), i++,
Insert Into( mycols, Column( dt, i ) )
);
//stack those columns creating a new data table
stacked_dt = dt << Stack(
columns( Eval( mycols ) ),
Source Label Column( "Gas" ),
Stacked Data Column( "PPM" )
);
missing_rows = stacked_dt << get rows where( Is Missing( :PPM ) );
stacked_dt << delete rows( missing_rows );
Re: Seleccionar celdas con datos vacíosOtra forma más de seleccionar filas con celdas vacías:
dt << select where(!Contains(Loc Nonmissing(dt << get as matrix), Row()));
Re: Seleccionar celdas con datos vacíosMuy hábil.No sabía que se podía insertar en una expresión (e).Pensé insertar en Necesitaba una lista.
Re: Seleccionar celdas con datos vacíosLa misma respuesta que PMroz usando manipulación de expresiones:
dt = Current Data Table();
e = Expr( Or() ); // the OR of the ismissing(columns) will be built here
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
Insert Into( e, Eval Expr( Is Missing( Expr( nc ) ) ) )
);
dt << selectwhere( e );
la expresión "e" parece
nameexpr(e)
/*:
Is Missing( :m1 ) | Is Missing( :m2 ) | Is Missing( :m3 ) | Is Missing( :m4 ) | Is Missing( :m5 ) | Is Missing( :m6 )
Fórmula recursiva de Head Arg
Introspección

Re: Seleccionar celdas con datos vacíosPuede utilizar el comando STACK para apilar sus datos, incluidos los valores de M1-Mn.Luego seleccione las filas que están vacías y elimínelas.
O prueba este código:
dt = Current Data Table();
col_list = dt << get column names( Numeric, string );
where_clause = "";
For( i = 1, i <= N Items( nc ), i++,
one_col = col_list[i];
if (i == 1,
// then
where_clause =evalinsert("\[dt << select where(is missing(as column(dt, "^one_col^"))]\");
// else
,
where_clause = evalinsert("\[^where_clause^ | is missing(as column(dt, "^one_col^"))]\");
);
);
where_clause = where_clause || ")";
eval(parse(where_clause));