Bonjour,
J'ai une grande table de données dont les colonnes ont un numéro d'identification suivi de mots comme ci-dessous,
| 1-Rendez-vous | 1 paramètre | 1-quelque chose | 2-quelque chose | 2-Date | 2 paramètres | 3 paramètres | 3 dates | 3-quelque chose | 3-sinon |
| | | | | | | | | | |
| | | | | | | | | | |
Mon objectif ultime est d'automatiser les cartes de contrôle avec la date comme étiquette d'échantillon. Il n'y a pas de quantités uniformes de colonnes pour chaque ID et elles ne sont pas triées par date croissante.
Mon idée est de diviser la grande table de données en plus petites par ID, puis de créer des cartes de contrôle à partir de celles-ci. Cependant, je ne sais pas comment faire ce fractionnement de manière automatisée.
Merci
La solution de Jim est la solution plus générale que j'ai mentionnée, si votre table n'a pas un modèle régulier de colonnes. La réponse de Jum n'est apparue qu'après avoir cliqué sur Post.
Charles,
Si votre colonne a une série régulière de 3 (Date, Nom du paramètre, Valeurs des données), cela peut être fait via l'interface utilisateur avec Menu principal > Tables > Pile et sélectionnez une pile de séries multiples, 3, et décochez la pile par ligne.Il faut un peu de nettoyage des noms de colonne, mais la table résultante peut être utilisée pour les cartes de contrôle en utilisant le nom du paramètre ou le groupe de données comme variable By.
Ou si vous voulez des tables séparées, vous pouvez utiliser Table Subset sur cette nouvelle table, cocher Subset By, puis spécifier Data Group.
Si votre tableau n'a pas d'ordre de série répété, un script ou beaucoup de travail manuel est nécessaire pour sous-ensemble chaque groupe. Répondez à ce message si votre tableau de données présente un ordre irrégulier des colonnes.
J'ai joint un script JSL qui devrait fonctionner pour votre table si elle a les colonnes de séries répétées et toutes les dates et tous les quelque chose sont du même type de modélisation (probablement numérique, continu).
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);
Sans plus de détails, je ne peux que donner une direction approximative sur la façon de résoudre ce problème.Je vois 2 méthodes pour aller après ce dont vous avez besoin.La première consiste à déterminer le nombre d'identifiants différents et à placer la colonne dans les différentes listes d'identifiants, en faisant quelque chose comme ceci :
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 || ");"
)
)
)
);
Vous pouvez ensuite parcourir la liste des ID et effectuer votre traitement.
L'autre méthode serait d'empiler toutes les colonnes, puis de créer une nouvelle colonne pour l'ID, de supprimer les valeurs d'ID des étiquettes, puis de diviser les colonnes en colonnes communes et d'effectuer votre traitement à l'aide d'une instruction By pour séparer le identifiants différents.Quelque chose comme
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
);
Maintenant, pour ma clarification ....... comme je l'ai dit, avec vos détails clairsemés, je fais beaucoup de suppositions à ce sujet.De plus, sans exemple de table de données, le code que j'ai fourni n'a pas été testé et je suppose qu'il ne fonctionnerait pas lors de la première exécution.Il est destiné à montrer une direction possible que vous pouvez prendre pour résoudre le problème