È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Vorrei automatizzare la creazione di più tabelle in pila da una tabella dati originale. Ho intenzione di farlo creando un elenco di parole chiave e se qualsiasi colonna nella mia tabella originale contiene quella parola chiave, verrà impilata in una nuova tabella dati. Essenzialmente ho un elenco di 3 parole chiave, quindi creerei 3 tabelle di dati in pila. Il mio script ha un ciclo for nidificato per scorrere tutte le colonne nella tabella dati originale e vedere se contengono la parola chiave da indicizzare. Vedi sotto:
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");
);
Il problema che sorge quando si esegue questo codice è che il primo gruppo viene impilato correttamente, ma quando il ciclo for indicizza su i=2 per cercare il gruppo successivo non riesce a guardare la tabella di dati originale e guarda invece la tabella che è stato appena impilato (tabella dati "abc Stacked" in questo caso).
Come posso fare in modo che il mio ciclo for guardi la mia tabella dati originale anziché la tabella appena creata. Grazie!
Migliore,
kaoticllama
Automazione e scriptingOrganizzazione dei contenutifinestreRe: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Devi solo specificare di utilizzare i dati originali nell'input Stack
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: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Ehi Jim,
Purtroppo l'ho già provato e non sembra funzionare. Si confonde ancora e pensa che mi riferisca alla tabella appena impilata durante l'esecuzione dell'iterazione i=2. Posso dirlo perché la mia tabella appena impilata ha 4 colonne. L'errore che ricevo è un errore di indicizzazione j che fallisce quando j=5.

Per riferimento, sto utilizzando JMP Pro 17.2.
Re: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Potrei averti confuso apportando 2 modifiche al tuo codice, ma ne parlo solo di una. Quando hai effettuato il test più recente, hai utilizzato la linea
tempTable = data table("Original Data") << Stack(
Se lo hai fatto e poi hai ricevuto l'errore specificato, ti chiederò di fornire una tabella dati di esempio ed esplorerò più approfonditamente il problema.
Re: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Ehi Jim,
Nessun problema, ecco il codice aggiornato e i dati di esempio. Ancora non funziona con la modifica suggerita.
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");
);Fammi sapere cosa trovi. Grazie
Re: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Era la funzione Nome colonna() a incasinare lo script. Punta alla tabella dati attiva corrente. Pertanto, ho aggiunto l'impostazione della tabella dati corrente alla tabella dati campione originale.
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: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Jim,
Grazie mille per il tuo aiuto su questo! Molto ben spiegato e funziona perfettamente.
Migliore,
kaoticllama
Re: È possibile creare più tabelle impilate da una tabella originale in un ciclo For nidificato?Ecco un altro suggerimento che ha modificato abbastanza pesantemente il tuo script. Utilizza un approccio leggermente diverso utilizzando For Each() (più facile da leggere (secondo me) rispetto a For()) e un array associativo per raccogliere i gruppi di colonne.
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);