Ciao,
Ho una grande tabella di dati che le colonne hanno un numero ID seguito da parole come di seguito,
| 1-Date | 1-parametro | 1-qualcosa | 2-qualcosa | 2-Date | 2-parametro | 3 parametri | 3-Date | 3-qualcosa | 3-else |
| | | | | | | | | | |
| | | | | | | | | | |
Il mio obiettivo finale è quello di automatizzare i grafici di controllo con Date come etichetta campione. Non ci sono quantità uniformi di colonne per ciascun ID e non sono ordinati per data crescente.
La mia idea è quella di dividere la grande tabella di dati in più piccoli per ID e quindi fare il controllo di grafici da quelli. Tuttavia, non so come farlo in modo automatico.
Grazie
La soluzione di Jim è la soluzione più generale che ho menzionato, se la tua tabella non ha uno schema regolare di colonne. La risposta di Jum è apparsa solo dopo aver colpito Post.
Charles,
Se la tua colonna ha una serie regolare di 3 (Data, Nome parametro, Valori dati), ciò può essere fatto tramite l'interfaccia utente con Menu principale> Tabelle> Pila e selezionare uno stack a più serie, 3, e deselezionare pila per riga. Ci vuole un po 'di pulizia dei nomi delle colonne, ma la tabella risultante può essere utilizzata per i grafici di controllo utilizzando Nome parametro o Gruppo di dati come variabile Per.
O se si desidera tabelle separate, è possibile utilizzare Table Subset su questa nuova tabella, selezionare Sottoinsieme, quindi specificare, Gruppo dati.
Se il tuo tavolo non ha un ordine di serie ripetuto, è necessario uno script o un sacco di lavoro manuale per suddividere ciascun gruppo. Rispondi a questo post se la tua tabella di dati ha un ordine irregolare di colonne.
Ho allegato uno script JSL che dovrebbe funzionare per la tua tabella se ha le colonne serie ripetute e tutte le date e tutti i Something hanno lo stesso tipo di modello (probabilmente numerico, continuo).
Names Default To Here(1);
dt = current data table();
cnames = dt << get column names("String");
stk = dt << Stack(
columns(
evalList(cnames)
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Stack By Row( 0 ),
Number of Series( 3 )
);
stk:Data << Set Name("Date");
stk:Data 2 << Set Name("Parameter Name");
stk:Data 3 << Set Name("Data");
stk:Label << set each value( trim(word(1,:Label,"-")));
stk:Label << Set Name( "Data Group");
stk << delete columns(:Label 2, Label 3);
Senza ulteriori dettagli, posso solo dare una direzione approssimativa su come risolverlo. Vedo 2 metodi per andare dopo quello che ti serve. Il primo è scoprire quanti ID diversi ci sono e posizionare la colonna nelle diverse liste per gli ID, facendo qualcosa del genere:
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Create an ID list
listOfIDs = {};
For( i = 1, i <= N Items( colNamesList ), i++,
If( Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) ) == 0,
// Insert into the listOfIDs, the new ID name
Insert Into( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) );
// Create a list to hold the column names for the new ID
Eval( Parse( "listOfColumns_" || Char( N Items( listOfIDs ) ) || " = {};" ) );
Eval(
Parse(
"insert into(listOfColumns_" || Char( N Items( listOfIDs ) ) || "," || Char(
Column( dt, colNamesList[i] ) << get name
) || ");"
)
);
,
// If the ID has already been see, then just add the column name to the
// ID list of column names
Eval(
Parse(
"insert into(listOfColumns_" || Char(
Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) )
) || "," || Char( Column( dt, colNamesList[i] ) ) << get name || ");"
)
)
)
);
È quindi possibile eseguire il ciclo di accesso a listOfID ed eseguire l'elaborazione.
L'altro metodo sarebbe quello di impilare tutte le colonne e quindi creare una nuova colonna per l'ID, rimuovere i valori ID dalle etichette e quindi suddividere le colonne in colonne comuni e eseguire l'elaborazione utilizzando un'istruzione By per separare il ID diversi. Qualcosa di simile a
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Stack the columns
dtStack = dt << Stack(
columns( colNamesList ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Drop All Other Columns( 1 )
);
// Create the ID Column
dtStack << New Column("ID", character,formula( word(1,:label,"-")));
// Now delete the ID from the :Label column
For Each Row(
:Label = trim(substr( :Label, contains(:Label,"-")+1));
);
// Split back to common columns
dtFinal = dtStack << Split(
Split By( :Label ),
Split( :Data ),
Sort by Column Property
);
Ora per il mio chiarimento ....... come ho affermato, con i tuoi dettagli sparsi, sto facendo molte ipotesi su questo. Inoltre, senza una tabella di dati di esempio, il codice che ho fornito non è stato testato, e presumo che non funzionerebbe alla prima esecuzione. Ha lo scopo di mostrare una direzione che è possibile adottare per risolvere il problema