Wie wende ich eine Formel auf alle Spalten einer anderen Tabelle an?Ich versuche, eine Tabelle zu nehmen und auf jede Funktion in jeder Spalte einen gleitenden Durchschnitt anzuwenden. Ich versuche es mit dem folgenden Skript, basierend auf dem, was ich in einem anderen Thread hier gesehen habe. Das Ziel besteht darin, eine neue Tabelle zu erstellen und dann die Funktion unter Bezugnahme auf das Original anzuwenden. Ich erhalte jedoch immer wieder einen Zugriffsfehler für die Datentabelle mit eingeschränktem Gültigkeitsbereich.
Test = Open("C:\Users\abrokaw\Desktop\JMP MA Test Table.jmp"); //open value data table
Testcols = Test << Get Column Names( string ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows(nrows(Test)); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ), i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] || "\!",
numeric,
continuous,
formula( test:" ||
Testcols[i] || "Col Moving Average( :Value, 1, 2, 2 ) ) )'"
)
)
);
TestMA << delete columns("column 1");
Automatisierung und SkriptingGrundlegende Datenanalyse und ModellierungBetreff: Wie wende ich eine Formel auf alle Spalten einer anderen Tabelle an?Sie haben den Verweis auf die Spalte in der Testtabelle an der falschen Stelle platziert. Außerdem habe ich von der Verwendung eines Formats auf die Verwendung von „Set Each Value“ umgestellt. Die resultierende Berechnung ist dieselbe, die Spalte ist jedoch keine Formelspalte. Dies führt dazu, dass die neue Datentabelle unabhängig von der Testtabelle ist. Ich habe auch den Endwert für die For()-Schleife geändert. Da Sie sowohl davor als auch danach zwei Zeilen einschließen, können Sie nicht über nrows-2 hinaus rechnen.
names default to here(1);
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test )-2, i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] ||
"\!",
numeric,
continuous,
set each value( Col Moving Average( test:" || Testcols[i] || ", 1, 2, 2 ) ) )"
)
);
);
TestMA << delete columns( "column 1" );
Verwenden Sie abschließend das JSL-Symbol oben auf dem Vorschaubildschirm, um Ihren Code einzugeben. Dies erleichtert das Lesen erheblich.
Der Code erfordert eigentlich nicht die Komplexität des Eval(Parse())-Codes. Er kann einfach offenen Code verwenden
Names Default To Here( 1 );
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ) - 2, i++,
TestMA << New Column( "MA_" || Testcols[i],
numeric,
continuous,
set each value( Col Moving Average( test:Testcols[i], 1, 2, 2 ) )
)
);
TestMA << delete columns( "column 1" );
Betreff: Wie wende ich eine Formel auf alle Spalten einer anderen Tabelle an?Sie können auch Subset verwenden, um die Spalten zu kopieren (dadurch werden auch Tabellenskripte und dergleichen kopiert, was ein Vorteil oder ein Problem sein kann). Denken Sie daran, Copy Formula(0) zu verwenden, wenn Sie die Option Subset verwenden und Formelspalten für Berechnungen verwenden.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cont_cols = dt << Get Column Names(string, continuous);
ma_cols = {};
For(i = 1, i <= N Items(cont_cols), i++, // could use For Each but I try to avoid ... Each loops nowadays
//Eval(EvalExpr()) isn't necessary here but makes debugghing much easier
new_col = Eval(EvalExpr(
dt << New Column("MA_" || cont_cols[i], Numeric, Continuous, Formula( // I also try to avoid Set Each Value in cases like this so I use Formula here
Col Moving Average(Expr(NameExpr(AsColumn(dt, cont_cols[i]))), 1, 2, 2)
));
));
Insert Into(ma_cols, new_col << get name);
);
dt_new = dt << Subset(All Rows, Columns(ma_cols), Copy Formula(0), Output Table("Moving Averages"));
dt << Delete Columns(ma_cols);Betreff: Wie wende ich eine Formel auf alle Spalten einer anderen Tabelle an?Danke, Jim. Diese Änderung funktioniert für einen Testdatensatz, den ich erstellt habe. Allerdings habe ich immer noch ein Problem mit derselben Fehlermeldung für meinen realen Datensatz. Ich denke, es hat etwas mit den Spaltennamen zu tun, denn wenn ich die Spaltennamen von meinem realen Datensatz in meinen Testdatensatz kopiere, erhalte ich dort ebenfalls dieselbe Fehlermeldung. Gibt es bestimmte Zeichen in einem Spaltennamen, die dieses Problem verursachen könnten?