La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Je souhaite automatiser la création de plusieurs tables empilées à partir d'une table de données originale. Je prévois de le faire en créant une liste de mots-clés, et si une colonne de ma table d'origine contient ce mot-clé, elle sera empilée dans une nouvelle table de données. Essentiellement, j'ai une liste de 3 mots-clés, je créerais donc 3 tableaux de données empilés. Mon script a une boucle for imbriquée pour parcourir toutes les colonnes de la table de données d'origine et voir si elles contiennent le mot-clé en cours d'indexation. Voir ci-dessous:
groupNames = {"abc", "def", "ghi"};
for (i = 1, i <= nitems(groupNames), i++,
for (j = 1, j <= ncols(Data Table("Original Data")), j++,
if ((contains(Column Name(j), groupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
tempTable = Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
);
tempStack = {};
tempTable << set name(char(groupNames[i]) || " Stacked");
);
Le problème qui se pose lors de l'exécution de ce code est que le premier groupe est très bien empilé, mais lorsque la boucle for indexe sur i=2 pour rechercher le groupe suivant, elle ne parvient pas à examiner la table de données d'origine et regarde à la place la table qui vient d'être empilé (table de données "abc Stacked" dans ce cas).
Comment puis-je faire en sorte que ma boucle for examine ma table de données d'origine au lieu de la table nouvellement créée. Merci!
Meilleur,
kaoticllama
Automatisation et scriptsOrganisation du contenules fenêtresRe : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Il vous suffit de spécifier d'utiliser les données d'origine pour l'entrée de la pile
groupNames = {"abc", "def", "ghi"};
For( i = 1, i <= N Items( groupNames ), i++,
For( j = 1, j <= N Cols( Data Table( "Original Data" ) ), j++,
If( (Contains( Column Name( j ), groupNames[i] )),
Insert Into( tempStack, Column Name( j ) )
)
);
tempTable = data table("Original Data") << Stack(
Columns( tempStack ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
"Non-stacked columns"n( Keep( :tst_temp, :stdf_file ) ),
Output Table( Char( groupNames[i] ) || " Stacked" )
);
tempStack = {};
);Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Salut Jim,
Malheureusement, j'ai déjà essayé cela et cela ne semble pas fonctionner. Il est toujours confus et pense que je fais référence à la table nouvellement empilée lors de l'exécution de l'itération i=2. Je peux le savoir car ma table nouvellement empilée comporte 4 colonnes. L'erreur que je reçois est une erreur d'indexation aj qui échoue lorsque j=5.

Pour référence, j'utilise JMP Pro 17.2.
Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Je vous ai peut-être confondu en apportant 2 modifications à votre code, mais en ne parlant que d'une seule. Lors de votre dernier test, avez-vous utilisé la ligne
tempTable = data table("Original Data") << Stack(
Si vous l'avez fait et que vous avez obtenu l'erreur que vous avez spécifiée, je vous demanderai de fournir un exemple de tableau de données et j'explorerai le problème davantage.
Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Salut Jim,
Pas de soucis, voici le code mis à jour et des exemples de données. Cela ne fonctionne toujours pas avec le changement que vous avez suggéré.
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Faites-moi savoir ce que vous trouvez. Merci
Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?C'était la fonction Column Name() qui gâchait le script. Il pointe vers la table de données active actuelle. Ainsi, j'ai ajouté le paramètre de la table de données actuelle à la table de données d'échantillon d'origine.
names default to here(1);
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
Current data table(data table("Sample"));
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Jim,
Merci beaucoup pour votre aide sur celui-ci ! Très bien expliqué et fonctionne parfaitement.
Meilleur,
kaoticllama
Re : La création de plusieurs tables empilées à partir d'une table d'origine dans une boucle For imbriquée est-elle possible ?Voici une autre suggestion qui a considérablement modifié votre script. Il utilise une approche un peu différente en utilisant For Each() (plus facile à lire (à mon avis) que For()) et un tableau associatif pour collecter les groupes de colonnes.
Names Default To Here(1);
// Initialize Associative Array with groups and empty lists
groups = ["abc" => {}, "def" => {}];
dt = Open("$DOWNLOADS/Sample.jmp");
colnames = dt << Get Column Names("String");
// Collect columns to each key in associative array
For Each({colname}, colnames,
For Each({{group, val}}, groups,
If(Contains(colname, group),
Insert Into(groups[group], colname);
);
);
);
// Loop over the associative array and create the stacked tables
stacked_tables = {};
For Each({{groupname, groupcols}}, groups,
stacked_dt = dt << Stack(
Columns(Eval(groupcols)),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n(Keep(:tst_temp, :stdf_file)),
Output Table(groupname || " Stacked"),
Invisible(1)
);
Insert Into(stacked_tables, stacked_dt);
);
show(stacked_tables);