¿Cómo aplicar una fórmula a todas las columnas de otra tabla?Estoy intentando tomar una tabla y aplicar una media móvil a cada función de cada columna. El siguiente script es lo que estoy probando, según lo que vi en otro hilo aquí. El objetivo es crear una nueva tabla y luego aplicar la función haciendo referencia al original. Sin embargo, sigo recibiendo un error de acceso a la tabla de datos de ámbito.
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");
Automatización y secuencias de comandosAnálisis y modelado de datos básicosRe: ¿Cómo aplicar una fórmula a todas las columnas de otra tabla?Ha colocado la referencia a la columna de la tabla Prueba en el lugar equivocado. Además, cambié de usar un formato a usar Establecer cada valor. El cálculo final resultante es el mismo, sin embargo, la columna no es una columna de fórmula. Esto da como resultado que la nueva tabla de datos sea independiente de la tabla de prueba. También cambié el valor final del bucle For(). Como está incluyendo 2 filas antes y después, no puede calcular más allá de nrows-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" );
Finalmente, utilice el ícono JSL en la parte superior de la pantalla de vista previa para ingresar su código. Hace que la lectura sea mucho más fácil.
En realidad, el código no requiere la complejidad del código Eval(Parse()). Solo puede usar código abierto.
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: ¿Cómo aplicar una fórmula a todas las columnas de otra tabla?También puede usar Subset para copiar las columnas (esto también copiará los scripts de las tablas y demás, lo que puede ser un beneficio o un problema). Recuerde usar Copiar fórmula (0) si elige la opción Subconjunto y usa columnas de fórmula para los cálculos.
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: ¿Cómo aplicar una fórmula a todas las columnas de otra tabla?Gracias, Jim. Este cambio funciona para un conjunto de datos de prueba que hice. Sin embargo, todavía tengo un problema con el mismo mensaje de error en mi conjunto de datos real. Creo que tiene algo que ver con los nombres de las columnas porque cuando copio los nombres de las columnas de mi conjunto de datos real a mi conjunto de prueba, también aparece el mismo error allí. ¿Hay ciertos caracteres en el nombre de una columna que podrían causar este problema?