Supprimer les lignes vides pour toutes les colonnes d'une listeRésolu : Re : Supprimer les lignes contenant une ou plusieurs valeurs vides avec JSL - Page 2 - Communauté d'utilisateurs JMP
Sur la base de la discussion ci-dessus, j'ai un script pour supprimer les lignes vides, mais il semble supprimer celles où elles sont vides dans N'IMPORTE QUELLE des colonnes répertoriées, alors que je souhaite supprimer celles où TOUTES sont vides pour les colonnes répertoriées.
Merci
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
keeprows = Loc Nonmissing( datacols );
dt << select rows( keeprows ) << invert Row Selection << delete rows;
Automatisation et scriptsRe : Supprimer les lignes vides pour toutes les colonnes d'une listeAvez-vous suffisamment étudié le JSL pour comprendre pourquoi il ne fait pas ce dont vous avez besoin ?
Jetez un œil au Guide de script sur Sélectionner où
Vous devrez trouver toutes les lignes qui ont des valeurs manquantes pour la première colonne dans datacols, puis dans cette liste de lignes, sélectionner les lignes qui ont des valeurs manquantes pour la deuxième colonne, puis la troisième, etc. jusqu'à ce que vous atteigniez la dernière colonne de la liste datacols.
Les lignes qui restent après cela ne seront que celles avec des valeurs manquantes pour toutes les colonnes de datacols.
Il ne vous reste plus qu’à supprimer les lignes restantes.
Examinez l'élément Current Selection() de la fonction Select Where(). Il limitera chaque Select Where suivant à l'affichage des lignes précédemment sélectionnées lors de l'application de la sélection.
Re : Supprimer les lignes vides pour toutes les colonnes d'une listeJim
Je crois comprendre, c'était un échec assuré. Ton idée, en revanche, est géniale ! Voilà à quoi ça ressemble.
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
For(l = Start, l <= End, l++,
full_rows = dt << get rows where( !Is Missing( As Column(cnmes[l]) ) );
For Each Row(If(is missing(cnmes[i]), Remove From(full_rows))));
dt << Select Rows(full_rows) << Invert Row Selection << Delete Rows;Re : Supprimer les lignes vides pour toutes les colonnes d'une listeEst-ce que ça marche ? Je ne vois pas comment. Vous traitez chaque colonne indépendamment des autres. Vous réinitialisez les full_rows pour chaque colonne.
Voici un exemple d'utilisation de la sélection multiple where()_to pour affiner les lignes que vous souhaitez sélectionner
names default to here(1);
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// Select all males
dt << select where( :Sex == "M");
// From all of the selected males, select all of the 12 year olds
dt << select where( :age == 12, Current Selection("Restrict"));Re : Supprimer les lignes vides pour toutes les colonnes d'une listeJe ne sais pas exactement ce qui se passe dans votre première partie du script ou comment cela est lié à cette question (pour créer la liste des colonnes ?) mais vous pouvez le faire : en utilisant la plate-forme JMP (modèle de données manquantes), sélectionnez où (comme Jim l'a suggéré) ou par exemple avec l'abonnement à la table de données + boucle / abonnement à la table de données + quelques opérations matricielles.
Je commencerais par essayer la plateforme de données manquantes proposée par JMP. Voyez si elle peut être utilisée à cette fin (c'est possible), puis examinez l'option Sélectionner l'emplacement suggérée par Jim. Après avoir écrit le script et compris le fonctionnement de la suggestion de Jim, vous pourrez commencer à examiner les options d'abonnement aux tables de données que je propose ci-dessous si cela vous intéresse.
Modèle de données manquantes
Utilisation de JMP > Saisir et modifier vos données > Organiser les données dans des tableaux de données > Afficher les modèles de données manquantes dans les tableaux de données
Guide de script > Tables de données > Scripts avancés pour tables de données > Rechercher les modèles de données manquants


Cela utilise des opérations matricielles et je pense que cela devrait fonctionner
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(11),
Compress File When Saved(1),
New Column("Column 1", Character, "Nominal", Set Values({"", "", "aa", "", "a", "a", "", "a", "", "a", ""})),
New Column("Column 2", Character, "Nominal", Set Values({"", "a", "a", "a", "a", "", "", "a", "a", "", ""})),
New Column("Column 3", Character, "Nominal", Set Values({"a", "", "a", "", "a", "", "a", "", "", "", "a"}))
);
cols_to_check = {"Column 2", "Column 3"};
m = Matrix(IsMissing(dt[0, cols_to_check]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
Cela bouclerait sur les lignes tout en vérifiant les valeurs manquantes
rows_to_delete = {};
For Each Row(dt,
m = Loc Nonmissing(dt[Row(), cols_to_check]);
If(N Items(m) == 0,
Insert Into(rows_to_delete, Row());
);
);
dt << Select Rows(rows_to_delete);
Re : Supprimer les lignes vides pour toutes les colonnes d'une listeil manque (liste) et il manque (matrice)
sympa ! - et inattendu.


Existe-t-il un aperçu général des fonctions JSL qui peuvent être « vectorisées » ?
Re : Supprimer les lignes vides pour toutes les colonnes d'une listeJe pensais que le script fonctionnait, mais il présente un défaut, comme vous le soulignez. J'ai essayé l'idée de @Jarmo et elle fonctionne, mais elle ne remplit pas la matrice pour moi.
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Device 2" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Device 2"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "Process Script" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "start_date"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
m = Matrix(IsMissing(dt[0, datacols]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
Re : Supprimer les lignes vides pour toutes les colonnes d'une listeVos colonnes de données correspondent-elles à ce que vous recherchez ? Vous devez également ajuster les deux options dynamiques pour qu'elles correspondent à vos données, par exemple :
rows_to_delete = Loc(V Sum(m`) == N Items(cols_to_check));
ça pourrait être une bonne idée
Re : Supprimer les lignes vides pour toutes les colonnes d'une listeJarmo
Ça a marché. Je me demandais vraiment quelle était la signification du 2.
Merci