Sélection de cellules avec des données videsJ'ai un tableau qui ressemble au tableau ci-dessous :
| opérateur |
Type M |
description |
descriptif 2 |
M1 |
M2 |
M3 |
M4 |
M5 |
M6 |
| 415 |
Nxyz |
Un chaud |
Nettoyage à chaud 1 |
415 |
415 |
415 |
415 |
415 |
415 |
| 615 |
Nxyz |
B froid |
Nettoyage à froid 1 |
615 |
615 |
615 |
|
615 |
615 |
| 815 |
Nxyz |
Un chaud |
Nettoyage à chaud 2 |
815 |
815 |
815 |
815 |
815 |
815 |
| 1015 |
Nxyz |
B froid |
Nettoyage à froid 2 |
1015 |
|
1015 |
1015 |
1015 |
1015 |
| 1215 |
Nxyz |
Un chaud |
Nettoyage à chaud 1 |
1215 |
1215 |
1215 |
1215 |
1215 |
1215 |
| 1415 |
Nxyz |
B froid |
Nettoyage à froid 1 |
1415 |
1415 |
1415 |
1415 |
1415 |
|
| 1615 |
Nxyz |
Un chaud |
Nettoyage à chaud 2 |
1615 |
1615 |
1615 |
1615 |
1615 |
1615 |
| 1815 |
Nxyz |
B froid |
Nettoyage à froid 2 |
1815 |
1815 |
1815 |
|
|
1815 |
Je souhaite sélectionner uniquement les lignes vides. Étant donné que les colonnes M1 à M6 peuvent varier à chaque fois que j'extrait les données, je ne peux pas utiliser les noms de colonnes dans le script JSL. J'essaie d'utiliser une boucle FOR ci-dessous pour sélectionner les lignes de données vides, mais cela sélectionne uniquement les lignes où la dernière cellule est vide.
dt = Current Data Table();
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
dt <<SELECT where=""></SELECT>
Finalement, je veux que la table de sortie ressemble à ce qui suit
| opérateur |
Type M |
description |
descriptif 2 |
Machine |
| 615 |
Nxyz |
B froid |
Nettoyage à froid 1 |
M4 |
| 1015 |
Nxyz |
B froid |
Nettoyage à froid 2 |
M2 |
| 1415 |
Nxyz |
B froid |
Nettoyage à froid 1 |
M6 |
| 1815 |
Nxyz |
B froid |
Nettoyage à froid 2 |
M4 |
| 1815 |
Nxyz |
B froid |
Nettoyage à froid 2 |
M5 |
La grande astuce est de le faire sans coder les noms de colonnes pour (M1, M2 etc...) car ils vont changer.
Des idées
Automatisation et scriptsRe : Sélection de cellules avec des données vides<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Merci à tous..... Tout a fonctionné sauf Loc Nonmissing..... Je n'ai que JMP9 pour le moment (trop paresseux pour mettre à niveau) et cette fonctionnalité ne fonctionne pas dans JMP9.... Je suis toujours un débutant en JSL.....Merci encore
Re : Sélection de cellules avec des données videsMS, c'est encore plus astucieux - voyons maintenant que vous le faites en 0 ligne de code !Ha ha, cela montre simplement qu'il existe plusieurs façons de faire la même chose en JSL.
Re : Sélection de cellules avec des données videsSi je lis correctement votre message, je pense que vous avez en fait deux questions.
- Comment trouver les lignes qui manquent toutes pour un ensemble de colonnes donné.
- Comment rendre votre code indépendant des noms de ces colonnes et de leur nombre.
Sans surprise, il existe de nombreuses façons différentes de procéder 1. PMroz , MS et Craige@JMP je vous ai donné quelques options là-bas.
Je vais en ajouter un de plus. Vous pourriez utiliser le Modèle de données manquantes utilitaire pour les trouver.
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" )
);
J'ai essayé de montrer comment faire fonctionner ce code pour un nombre quelconque de colonnes. Dans ce cas, comme j'avais besoin d'une liste de colonnes à transmettre à l'utilitaire Missing Data Pattern, j'ai construit une liste basée sur les numéros de colonnes.
Même après avoir écrit tout cela et montré comment utiliser l'utilitaire Missing Data Pattern, je pense que ma solution préférée ici serait PMroz c'est à utiliser Empiler les colonnes . De toute façon, vous voulez vraiment vous retrouver avec les données empilées, donc cela permet d'abord de simplement sélectionner les lignes manquantes dans la colonne empilée et de les supprimer.
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 : Sélection de cellules avec des données videsEncore une autre façon de sélectionner des lignes avec des cellules vides :
dt << select where(!Contains(Loc Nonmissing(dt << get as matrix), Row()));
Re : Sélection de cellules avec des données videsTrès lisse.Je ne savais pas que vous pouviez insérer dans une expression (e).Je pensais insérer dans j'avais besoin d'une liste.
Re : Sélection de cellules avec des données videsMême réponse que PMroz en utilisant la manipulation d'expressions :
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 );
l'expression "e" ressemble à
nameexpr(e)
/*:
Is Missing( :m1 ) | Is Missing( :m2 ) | Is Missing( :m3 ) | Is Missing( :m4 ) | Is Missing( :m5 ) | Is Missing( :m6 )
Formule récursive Head Arg
Introspection

Re : Sélection de cellules avec des données videsVous pouvez utiliser la commande STACK pour empiler vos données, y compris les valeurs de M1-Mn .Sélectionnez ensuite les lignes vides et supprimez-les.
Ou essayez ce code :
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));