Ich habe einen Vorlagendatenrahmen, der 209 Spalten mit der Bezeichnung 1-209 enthält. Oft leitet ein Client mir Datensätze weiter, die kombinierte Spalten enthalten. Beispielsweise kann Spalte 2 mit Spalte 3 (mit '2 + 3' gekennzeichnet) 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 konvertiert, um die beiden Datensätze auszurichten.
Ich habe in dieser E-Mail angehängt, wie die Vorlagen- und Zieldatensätze aussehen.
Hier ist ein einfaches Skript, das die kombinierten Spalten erweitert.Hinweis: Die Spaltennamen in der Vorlagendatentabelle haben einen Fehler.Der Spaltenname 95 wird zweimal angezeigt.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 )));
Hallo @ MikeDereviankin ,
Ich bin mir nicht sicher, ob ich vollständig verstanden habe, wonach Sie gesucht haben, aber ich denke schon, und habe ungefähr einen Tag daran gearbeitet. (Ich bin kein so schneller Programmierer oder JSL-versierter wie @ txnelson , er kennt sich aus!). Ich habe auch seinen Code nicht ausprobiert, aber ich bin dazu gekommen, anders darüber nachzudenken (glaube ich).
Der folgende Code übernimmt die Spaltennamen aus der "Ziel" -Datentabelle mit "+" und erstellt eine neue Formelspalte in der "Vorlagen" -Datentabelle, die diese spezifischen Spalten zusammenfügt. Anschließend werden sie an die richtige Stelle in der Datentabelle verschoben und die ursprünglichen Spalten gelöscht, die zusammengefügt wurden. Außerdem wird die Formeleigenschaft aus der Spalte entfernt.
Es dauerte ungefähr einen Tag, um nach dem richtigen Weg zu suchen, um die Spaltennamen aufzurufen, da es sich um Zahlen handelt. Es ist viel einfacher, Charakternamen zu haben, um sie ohne die Befehle Eval () und Parse () usw. zu referenzieren. Ich bin sicher, dass jemand besser es eleganter machen kann, aber das funktioniert (zumindest so, wie ich Sie gefragt habe wie es geht). Ich habe dort einen Wait () - Befehl eingefügt, aber das 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