JSL - Trouver le% de données manquantesJ'ai un tableau de données avec 3 colonnes

Je dois créer un tableau affichant le% de données manquantes dans la colonne HEIGHT regroupées par ID et SUB_ID. Dans le cas ci-dessus, le résultat devrait être :

Mais il est possible dans certains cas qu’aucune ligne ne comporte des données manquantes. Dans ce cas, le pourcentage manquant devrait être égal à 0.

J'ai besoin d'aide pour écrire un script JSL pour cela. J'apprécierai toute orientation. J'ai trois problèmes dans mon script ci-dessous :
1. Comment puis-je suivre la poignée/référence à une table de données afin de pouvoir la rappeler à tout moment. J'ai toujours utilisé "dt = CurrentDataTable" au début du script. Mais après avoir créé quelques tableaux récapitulatifs/tableaux de sous-ensembles, je perds la référence au tableau d'origine et je ne sais pas comment le rendre actuel.
2. J'ai besoin que cela fonctionne même s'il n'y a aucune ligne manquante. Pour le moment, le script s’arrête au milieu.
3. J'ai besoin que toutes les tables soient fermées, à l'exception de la table finale avec le pourcentage manquant.
// Read the original table
dt = CurrentDataTable();
main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt<< Summary(Group(:ID, :SUB_ID), Freq("None"), Weight("None"), output table name( "Main Table Summary"));
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
Current Data Table(Data Table(main_table));
dt = CurrentDataTable();
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));
If( !Is Empty( dt_missing ),
dt_missing_summary = Data Table( dt_missing ) << Summary(
Group( :ID, :SUB_ID ),Freq("None"), Weight("None"), output table name( "Missing Rows Table Summary"));
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
//Close( dt_missing, nosave );
//Close( dt_summary, nosave );Merci
Mélange et nettoyage des donnéesRe: JSL - Trouver le % de données manquantesMerci pour votre réponse. Je ne savais pas jusqu'à présent que N Missing pouvait être utilisé pour rechercher les lignes de données manquantes. Cela a rendu le travail beaucoup plus facile et réduit quelques étapes dans le script.Re: JSL - Trouver le % de données manquantesMerci pour l'explication étape par étape. Les étapes 1, 2 et 4 sont les nouvelles astuces que j'ai apprises et sont très utiles. Pas étonnant que mon script échoue s'il ne manque aucune donnée. Je n'oublierai pas de diviser la déclaration lors de l'application de plusieurs conditions.Re: JSL - Trouver le % de données manquantesMerci pour la solution simple et compacte. Cela ajoute une colonne supplémentaire au tableau d'origine mais ce n'est pas un problème pour moi.Re: JSL - Trouver le % de données manquantesVEUILLEZ RELIRE si vous avez vu cela plus tôt. Il y avait une erreur.
L'utilisation de la fonction intégrée de JMP, Col N Missing ( ), simplifie cette tâche. Je vais montrer 2 approches.
SOLUTION N°1 :
- Créez une colonne pour compter les disparus par groupe dans le premier tableau.
- Résumez le premier tableau.
- Modifiez le nom de la colonne N Lignes (si vous le souhaitez) et créez une colonne de formule pour le ratio.
Names Default To Here( 1 );
//these 2 lines just create a table with overall missing rate of 35% for the weight varable.
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//add a formula column to compute n missing rows.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
//create summary table, rename N Rows column, and add a % missing formula column.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows));
dtSum:N Rows << set name("Total Rows");
dtSum << new column ("Pct Missing", formula(:missing rows / :total rows));
SOLUTION N°2 :
- Créez toutes les colonnes de formules dans le premier tableau, puis faites un résumé simple.
- Vous pouvez éventuellement supprimer la colonne N lignes du tableau récapitulatif.
** Le « piège » de cette méthode se trouve dans la fonction Total Rows ( ). Vous devez commencer par un "1" pour le premier argument, afin de servir de colonne factice, car le premier argument ne peut pas être utilisé comme colonne de regroupement. Omettez le 1 et vous verrez que les décomptes reflètent uniquement le nombre de lignes dans le groupe "type"... et non la combinaison du pays et du type.
Bravo et excuses pour l'erreur du premier passage.
Names Default To Here( 1 );
//don't worry about these; these are just to get a table present with some missing values @ an
//overall missing rate of 35%
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//create formula columns using built-in functions to get what you're after.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
dt << New Column( "Total Rows", formula( Col Number( 1, :country, :type ) ) );
dt << New Column( "Group Pct Missing", formula( :missing rows / :total rows ) );
//view summary table.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows, :total rows, :group pct missing));
Re: JSL - Trouver le % de données manquantes- Vous devez ajouter
Names Default To Here( 1 );
pour limiter les variables spécifiées dans votre script afin qu'elles ne soient pas modifiées par les variables d'autres scripts du même nom, en modifiant les valeurs de votre script actuel
- Il semble que vous ayez un malentendu sur la fonction Current Data Table().Il peut être utilisé de 2 manières différentes et vous aidera à ne pas perdre la référence à votre table de données d'origine.La spécification
dt = Current Data Table();
vous avez utilisé correctement.Et lorsque plus tard dans votre script, vous souhaitez faire de la table de données d'origine la "table de données actuelle", tout ce que vous avez à faire estcurrent data table(dt);
Cela indiquera à JMP d'utiliser "dt" comme table de données actuelle.Ce que vous devez éviter de faire, c'est de réaffecter "dt" en le plaçant sur le côté gauche d'un "=".
- Parfois, ce n’est pas une bonne chose de combiner des actions dans une seule déclaration.Ton
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));s'attend à sélectionner des lignes et à sous-ensembler la table en une seule instruction.Le problème est qu’il ne parviendra pas à vous donner ce que vous voulez s’il ne manque aucune valeur de :Height.Dans ma refonte de votre script (ci-dessous), la table de données dt a les lignes sélectionnées ou non, puis la vérification est effectuée pour voir si des lignes manquantes ont été trouvées, et si c'est le cas, continuez le traitementdt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- La fonction Try() est très pratique pour exécuter des fonctions qui pourraient échouer, et si c'est le cas, vous ne voulez pas que le script s'arrête.Les fonctions Close() que vous utilisez et idéales pour utiliser la fonction Try()
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
J'espère que cela vous sera utile..... si vous avez d'autres questions, veuillez répondre
Names Default To Here( 1 );
// Read the original table
dt = Current Data Table();
//main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt << Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Main Table Summary" )
);
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
//Current Data Table(Data Table(main_table));
//dt = CurrentDataTable();
dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
dt_missing = dt << Subset( Output Table Name( "Missing Rows" ), selected rows( 1 ) );
dt_missing_summary = Data Table( dt_missing ) <<
Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Missing Rows Table Summary" )
);
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Re: JSL - Trouver le % de données manquantes@jthi ,
Nous réfléchissions dans le même sens en même temps, j'aime que votre réponse soit un peu plus complète que la mienne et soit d'accord avec les suggestions des points 1 et 3.
Re: JSL - Trouver le % de données manquantesTout d'abord, je suggère fortement de consulter le guide de script JMP : Guide de script JMP15 et Scripting Index trouvé dans Jmp / Help / Scripting Index. Ce sont de très bonnes sources pour les scripts JSL.
Pour effectuer cette tâche, vous n'aurez pas besoin de jsl :
1. Commençons par l'exemple de tableau que vous nous avez fourni avec deux valeurs manquantes
2. Créez un résumé du tableau avec N manquant avec la hauteur comme statistiques et SUB_ID et ID comme groupe


3. Créez une nouvelle formule en sélectionnant N lignes et N colonnes manquantes (HAUTEUR)

4. Modifiez le format en Pourcentage dans les propriétés de la colonne et renommez les colonnes si nécessaire
Sur la base de ces étapes, vous pouvez également utiliser assez facilement les fonctionnalités fournies par JMP pour afficher les scripts nécessaires aux étapes permettant de transformer ce processus manuel en processus automatisé (de petites modifications doivent être apportées pour le rendre plus robuste).
Et pour vos questions 1 & 3 :
1. Cela dépend beaucoup de la façon dont vous créez/ouvrez/obtenez vos tables de données. Si vous avez toujours le même nom, vous pouvez y faire référence, mais je n'y ferais pas confiance à long terme car il est si facile de créer plusieurs tables de données avec le même nom et JMP ajoutera une indexation après les noms. Mais ceux-ci peuvent être référencés par Datatable(nameofdatatable).
3. Vous pouvez obtenir la liste des tables de données avec Get Data Table List(). Parcourez les tables de données et fermez celles qui ne sont pas nécessaires. Mais à mon avis, vous devriez toujours fermer le datatable dont vous n'aurez pas besoin dès que possible avec Close (référence au datatable, No save).
Exemple de script pour effectuer la tâche :
Names Default To Here(1);
//create example data and add reference to dt variable
dt = New Table("exampledata",
Add Rows(8),
Compress File When Saved(1),
New Column("ID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 2, 2, 2, 2])
),
New Column("SUB_ID",
Character,
"Nominal",
Set Values({"A", "A", "B", "B", "A", "A", "B", "B"})
),
New Column("HEIGHT",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([10, 11, ., 9, ., 12, 8, 12])
)
);
//note Link to original data table(0)
//dt_summary is reference to the new Summary table
dt_summary = dt << Summary(
Group(:ID, :SUB_ID),
N Missing(:HEIGHT),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Main Table Summary")
);
//close unnecessary datatable
Close(dt, no save);
//add new column with formula
dt_summary << New Column("Percent Missing",
Numeric,
"Continuous",
Format("Percent", 12, 0),
Formula(:Name("N Missing(HEIGHT)") / :"N Rows"),
);
//rename columns
Column(dt_summary, "N Rows") << Set Name("Total No of Rows");
Column(dt_summary, "N Missing(HEIGHT)") << Set Name("No of Rows with Missing Data");
Re: JSL - Trouver le % de données manquantesSalut @rverma ,
Je vois que vous pouvez profiter du résumé dans les tableaux.Je peux produire la plupart de ce que vous faites dans cette section, puis ajouter une colonne avec une formule pour calculer le ratio (%).
Je pourrais créer le script comme celui-ci qui fonctionnera toujours s'il n'y a aucune donnée manquante (ajoute l'élément 2) :
sumdt = dt << Summary( Group( :ID, :SUB_ID ), N Missing( :HEIGHT ), Freq( "None" ), Weight( "None" ) );
sumdt << New Column( "Percent Missing",
Numeric,
Continuous,
Format( Percent ),
Formula( :"N Missing(HEIGHT)"n / :N Rows )
);
Ensuite, vous pourriez sous-ensembler cela. Et fermez toujours les autres fenêtres.
C'est un début