Ich habe einen Vorlagendatenrahmen, der 209 Spalten mit der Bezeichnung 1-209 enthält. Oftmals leitet mir ein Kunde Datensätze mit kombinierten Spalten weiter, z. B. kann Spalte 2 zusammen mit Spalte 3 (mit der Bezeichnung „2 + 3“) im neuen Datensatz hinzugefügt werden.
Wie kann ich die Spalten im neuen Datensatz extrahieren und diese als Formeln verwenden, um die Spalten im Vorlagendatenrahmen gleich zu machen? Ich weiß, dass JMP eine Kombinationsfunktion hat, aber wie kann ich ein Skript schreiben, das alle Spaltennamen extrahiert und diese in Formeln umwandelt, um die beiden Datensätze auszurichten?
Ich habe dieser E-Mail beigefügt, wie die Vorlage und die Zieldatensätze aussehen.
Hallo @MikeDereviankin ,
Ich bin mir nicht sicher, ob ich ganz verstanden habe, was Sie wollten, aber ich glaube schon, und habe etwa einen Tag daran gearbeitet. (Ich bin kein so schneller Programmierer oder JSL-Kenntnis wie @txnelson , er kennt sich aus!). Ich habe seinen Code auch nicht ausprobiert, bin aber anders darauf gekommen (glaube ich).
Der folgende Code übernimmt die Spaltennamen aus der „Ziel“-Datentabelle, die „+“ enthalten, und erstellt eine neue Formelspalte in der „Vorlage“-Datentabelle, die diese spezifischen Spalten zusammenfügt. Anschließend werden sie an die richtige Stelle in der Datentabelle verschoben und die ursprünglich addierten Spalten gelöscht. Außerdem wird die Formeleigenschaft aus der Spalte entfernt.
Es hat etwa einen Tag gedauert, herauszufinden, wie die Spaltennamen richtig aufgerufen werden können, da es sich um Zahlen handelt. Es ist viel einfacher, Zeichennamen zu haben, um auf sie zu verweisen, ohne die Befehle Eval() und Parse() usw. zu verwenden. Ich bin sicher, jemand Besseres kann es eleganter machen, aber das funktioniert (zumindest so, wie ich Ihre Frage interpretiert habe). wie es geht). Ich habe dort einen Wait()-Befehl eingefügt, aber den brauchen Sie wahrscheinlich nicht.
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 ) || "\!")" ) ) );
);Hoffe das hilft!,
DS
Hier ist ein einfaches Skript, das die kombinierten Spalten erweitert.Hinweis: Sie haben einen Fehler in den Spaltennamen in der Vorlagendatentabelle.Der Spaltenname 95 erscheint zweimal.Der zweite soll 98 sein.
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 )));