Come applicare una formula a tutte le colonne in un'altra tabella?Sto cercando di prendere una tabella e applicare una media mobile a ogni funzione su ogni colonna. Lo script seguente è quello che sto provando, in base a ciò che ho visto in un altro thread qui. L'obiettivo è creare una nuova tabella e quindi applicare la funzione facendo riferimento all'originale. Tuttavia, continuo a ricevere un errore di accesso alla tabella dati con ambito.
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");
Automazione e scriptingAnalisi e modellazione dei dati di baseRe: Come applicare una formula a tutte le colonne di un'altra tabella?Hai inserito il riferimento alla colonna nella tabella Test nel posto sbagliato. Inoltre, sono passato dall'utilizzo di un formato all'utilizzo di Imposta ogni valore. Il calcolo finale risultante è lo stesso, tuttavia la colonna non è una colonna formula. Ciò fa sì che la nuova tabella dati sia indipendente dalla tabella Test. Ho anche cambiato il valore finale per il ciclo For(). Poiché includi 2 righe sia prima che dopo, non puoi calcolare oltre nrighe-2
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" );
Infine, utilizza l'icona JSL nella parte superiore della schermata di anteprima per inserire il codice. Rende la lettura molto più semplice.
Il codice in realtà non richiede la complessità del codice Eval(Parse()). Può semplicemente utilizzare codice aperto
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" );
Re: Come applicare una formula a tutte le colonne di un'altra tabella?Puoi anche utilizzare Subset per copiare le colonne (questo copierà anche gli script di tabella e simili, il che può essere un vantaggio o un problema). Ricorda di utilizzare Copia formula (0) se utilizzi l'opzione Sottoinsieme e utilizzi le colonne formula per i calcoli
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);Re: Come applicare una formula a tutte le colonne di un'altra tabella?Grazie, Jim. Questa modifica funziona per un set di dati di test che ho apportato. Tuttavia, riscontro ancora un problema con lo stesso messaggio di errore sul mio set di dati reale. Penso che abbia qualcosa a che fare con i nomi delle colonne perché quando copio i nomi delle colonne dal mio set di dati reali al mio set di test, ottengo lo stesso errore anche lì. Sono presenti determinati caratteri nel nome di una colonna che potrebbero causare questo problema?