Générer le même résultat pour tous les niveaux d'une variable catégorielleSalut,
J'ai un script qui effectue des calculs, exécute des processus et extrait des données, puis ouvre une boîte à onglets dans une nouvelle fenêtre. Je souhaite répéter cette opération pour chaque niveau d'une variable catégorielle définie par l'utilisateur dans ma boîte de dialogue.
Actuellement, je crée des sous-ensembles individuels de données en fonction de ma variable de regroupement, puis je parcours chacun de ces ensembles de données :
dtSubset = dt << Subset( By( Eval( groupVar ) ), Linked, Selected Columns Only( 0 ), All Rows( 1 ), Invisible );
For( i = 1, i <= N Items( unique_groups ), i++,
dt_i = dtSubset[i];
...some code to do stuff
<BR />...append output as a new tab box in my window
);
Essentially all I am doing is coding up my own analysis and wanting a 'By' variable. I am wondering if there is a better or more efficient way to go about this? The main thing I want with the code is to have the output I create be specific for each level, while also still maintaining a connection to the original data table (meaning the plots in my output are interactive still).
Comme vous pouvez le constater, je crée les sous-ensembles comme invisibles, puis je les ferme dans mon code à la fin de chaque itération de la boucle.
Merci,
Robert
Automatisation et scriptageRe : Générer le même résultat pour tous les niveaux d’une variable catégorielleExiste-t-il une raison de ne pas utiliser la variable By au sein des plateformes ?
Re : Générer le même résultat pour tous les niveaux d’une variable catégorielleVoici trois options pour créer une boîte à onglets à partir d'un tableau de données en utilisant une colonne de regroupement. Si vous utilisez JMP 18 ou une version ultérieure (il me semble), la dernière option est sans aucun doute la plus simple.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Using subsets
dt_subsets = dt << Subset(
By(:age),
Linked,
Selected Columns Only(0),
All Rows(1),
Invisible
);
nw = New Window("Subsets",
tb = tab box()
);
dists = {};
For Each({dt_subset}, dt_subsets,
tb << Insert(Tab Page Box(Title(dt_subset << get name),
dt_subset << Distribution(
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age))
);
));
);
tb << Set Selected(1);
// Using Where in platform
nw = New Window("Where",
tb = tab box()
);
groups = Associative Array(Column(dt, "age")) << get keys;
dists = {};
For Each({group}, groups,
tb << Insert(Tab Page Box(Title("age=" || Char(group)),
dist = dt << Distribution(
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
Where(:age == group)
);
));
(Report(dist) << Top Parent)[TextBox(1)] << Visibility("Collapse"); // to hide Where(... textbox
);
tb << Set Selected(1);
// Using By in platform
dist = dt << Distribution(
Group Options(Layout("Arrange in Tabs")),
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
By(:age)
);
Re : Générer le même résultat pour tous les niveaux d’une variable catégoriellePour compléter l'exemple « Par groupe » de Jarmo, voici un exemple qui crée la fenêtre à onglets que votre résultat présente.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Using By in platform
dist = dt << Distribution(Invisible,
Group Options(Layout("Arrange in Tabs")),
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
By(:age)
);
// Create a new window and add tabs for each age
nw = New Window( "Tabs",
tabb = Tab Box();
);
For( i = 1, i <= N Items( dist ), i++,
display = Report( dist[i] );
theByGroup = display[Outline Box( 1 )] << get title;
tabb << append( Tab Page Box( Title( theByGroup ), display ) );
);

Re : Générer le même résultat pour tous les niveaux d’une variable catégorielleLa raison principale est que j'ai trouvé plus simple de parcourir les différents niveaux de ma variable et de construire chaque onglet de cette manière, puis de les ajouter. En effet, pour chaque niveau, j'effectue des calculs pour les tableaux, je construis un graphique avec l'outil de création de graphiques, j'extrais les graphiques quantile-quantile de la plateforme Dist, j'extrais le graphique des résidus studentisés de la plateforme d'ajustement du modèle, etc.
Re : Générer le même résultat pour tous les niveaux d’une variable catégorielleMerci à vous deux pour vos contributions, le code fourni fonctionne parfaitement. Je précise que je développe une extension assez complexe qui exploite de nombreuses plateformes et génère également des résultats inédits. Je souhaitais surtout que mes graphiques et tableaux, normalement liés à ma table de données, le restent. Je voulais aussi que chaque onglet ait une apparence identique ; l’utilisation d’une boucle m’a donc semblé une solution simple.
Pensez-vous que la meilleure façon de procéder soit d'utiliser l'option « Par » sur toutes les plateformes que j'utilise, puis de parcourir les niveaux de ma variable en appelant chaque composant via les différents chemins et en les ajoutant là où je le souhaite ?
Re : Générer le même résultat pour tous les niveaux d’une variable catégorielleSi vous les ajoutez comme Jim l'a montré, l'interactivité sera perdue. Les clauses Subset et Where fonctionnent bien, mais il existe des cas où l'utilisation de Where est plus complexe, notamment lors de la création de tableaux récapitulatifs (qui utilise un filtre de données local au lieu d'une simple clause Where). De plus, avec les sous-ensembles, vous risquez de vous retrouver avec un grand nombre de tables de données à gérer, car elles peuvent ne pas se fermer correctement (lors de la fermeture de la table principale). Il peut parfois être judicieux d'utiliser un filtre de données local, car vous pouvez utiliser un seul filtre pour plusieurs plateformes grâce à la boîte de dialogue de filtre de données.