J'ai une trame de données modèle qui contient 209 colonnes étiquetées 1-209. Souvent, un client me transmettra des ensembles de données qui ont des colonnes combinées, par exemple, la colonne 2 peut être ajoutée à la colonne 3 (étiquetée '2 + 3') dans le nouvel ensemble de données.
Comment puis-je extraire les colonnes du nouvel ensemble de données et les utiliser comme formules pour rendre les colonnes identiques dans le cadre de données du modèle ? Je sais que JMP a une fonction de combinaison, mais comment puis-je écrire un script qui extrait tous les noms de colonnes et les convertit en formules pour aligner les deux ensembles de données.
J'ai joint à quoi ressemblent le modèle et les ensembles de données cibles dans cet e-mail.
Salut @MikeDereviankin ,
Je ne suis pas sûr d'avoir complètement compris ce que vous recherchiez, mais je pense que oui, et j'ai travaillé dessus pendant environ une journée. (Je ne suis pas un programmeur aussi rapide ou connaissant JSL que @txnelson , il connaît son affaire!). Je n'ai pas non plus essayé son code, mais j'y suis arrivé en y pensant différemment (je pense).
Le code ci-dessous prendra les noms de colonne de la table de données "cible" qui contiennent "+", créera une nouvelle colonne de formule dans la table de données "modèle" qui ajoutera ces colonnes spécifiques ensemble. Il les déplace ensuite vers l'emplacement approprié dans la table de données et supprime les colonnes d'origine qui ont été additionnées. Il supprime également la propriété de formule de la colonne.
Il a fallu environ une journée pour rechercher la bonne façon d'appeler les noms de colonnes car ce sont des nombres. Il est beaucoup plus facile d'avoir des noms de caractères afin de les référencer sans les commandes Eval() et Parse(), etc. Je suis sûr que quelqu'un de mieux peut le rendre plus élégant, mais cela fonctionne (au moins la façon dont je vous ai interprété en demandant pour savoir comment faire). J'y ai mis une commande Wait(), mais vous n'en avez probablement pas besoin.
Names Default To Here( 1 );
//defines the two data tables, they must be open already and named appropriately
dt_target = Data Table( "Target" );
dt_template = Data Table( "Template" );
//This gets the column names for each table
target_col_names = dt_target << get columnnames( Numeric, string );
template_col_names = dt_template << get column Names( Numeric, string );
//This tests the column names in the target data table to see if there is a "+" and if so puts that column name in the target_col_keep list
target_col_keep = {};
For( i = 1, i <= N Cols( dt_target ) - 1, i++,
If( Contains( target_col_names[i], "+" ) != 0,
Insert Into( target_col_keep, target_col_names[i] )
)
);
//This loops through the items in target_col_keep to make new columns and add formulas.
//The complicated part of As Column(Num(Word(Eval(EvalExpr(Expr()))))) basically converts the number names to a reference-able column.
//The extra +1 is there because of the first column in the dt_template data table -- it offsets the column numbers on down the line in <BR />//reference to the target data table.
//The first word command gets only the first column of the added up to the "+", hence Word(1,...)
//The second word command gets only the second word after the "+", hence Word(2,...)
//The new columns are added to the end of the data table.
i=.;//reset counter
For( i = 1, i <= N Items( target_col_keep ), i++,
dt_template << New Column( target_col_keep[i],
"Numeric",
"continuous",
Formula(
As Column( (Num( Word( 1, Eval( Eval Expr( Expr( target_col_keep[i] ) ) ), "+" ) ) + 1) ) + As Column(
(Num( Word( 2, Eval( Eval Expr( Expr( target_col_keep[i] ) ) ), "+" ) ) + 1)
)
)
);
//this step moves the newly created column after the second column of the sum. Comment out if you don't want to move them.
prevcol = Num( Word( 1, Eval( Eval Expr( Expr( target_col_keep[i] ) ) ), "+" ) );
dt_template << select Columns( As Column( Eval( Eval Expr( Expr( target_col_keep[i] ) ) ) ) ) <<
Move Selected Columns( After( Column( Parse( ":Name(\!"" || Char( prevcol ) || "\!")" ) ) ) );
);
Wait(0.5);
//This part removes the formula. Comment out if you don't want to remove the formula.
j = .;//reset counter
For( j = 1, j <= N Col( dt_template ), j++,
As Column( j ) << Delete property( "Formula" )
);
//This deletes the old columns that were added together. Comment out if you don't want to delete them.
k=.;//reset counter
For( k = 1, k <= N Items( target_col_keep ), k++,
str1 = Num( Word( 1, Eval( Eval Expr( Expr( target_col_keep[k] ) ) ), "+" ) );
str2 = Num( Word( 2, Eval( Eval Expr( Expr( target_col_keep[k] ) ) ), "+" ) );
dt_template << Delete Columns( Column( Parse( ":Name(\!"" || Char( str1 ) || "\!")" ) ) );
dt_template << Delete Columns( Column( Parse( ":Name(\!"" || Char( str2 ) || "\!")" ) ) );
);J'espère que cela t'aides!,
DS
Voici un script simple qui développe les colonnes combinées.Remarque : vous avez une erreur dans les noms de colonne de la table de données du modèle.Le nom de colonne 95 apparaît deux fois.Le deuxième est censé être 98.
Names Default To Here( 1 );
// Point to the 2 data tables....assumption is they are open
dtTemplate = Data Table( "Template_Template" );
dtTarget = Data Table( "Target_Target" );
// Create a template data table with just the column names
dtHeader = dtTemplate << subset( selectd rows( 0 ), selected columns( 0 ) );
dtHeader << select where( Row() > 0 );
dtHeader << delete rows;
// Change the column data type to match in incoming target data
dtHeader:Column 1 << datatype( character );
// Concatenate the data together. JMP will match all columns with the
// same name, and create new columns for ones that don't have a match
dtInterim = dtHeader << concatenate( dtTarget );
// Loop across the new columns and assign the values back to the columns
// the values need to be in
For( i = N Cols( dtHeader ) + 1, i <= N Cols( dtInterim ), i++,
start = Num( Word( 1, Column( dtInterim, i ) << get name, "+" ) );
end = Num( Word( 2, Column( dtInterim, i ) << get name, "+" ) );
For( k = start, k <= end, k++,
Column( dtInterim, Char( k ) )[1] = Column( dtInterim, i )[1]
);
);
// Delete the extra columns
dtInterim << delete columns( index(N Cols( dtHeader ) + 1, N Cols( dtInterim )));