Hacer referencia a columnas de otras tablasEstoy tratando de hacer una nueva tabla leyendo de dos tablas de origen.Me gustaría evitar unirlos en una gran mesa y manipularlos desde allí.La nueva tabla será una matriz de deltas entre las dos tablas de origen.El script está creando las columnas muy bien, pero no las está completando con nada.Supongo que me falta algo de sintaxis al hacer referencia a columnas de otras tablas en mi fórmula.
predt = Open("C:\...\pre_data.jmp");
predtcols = predt << Get Column Names (string);
postdt = Open("C:\...\post_data.jmp");
postdtcols = postdt << Get Column Names (string);
dt = new table ("delta_values");
for (i=1, i <= NCols(predt), i++,
dt << New column ("delta_"||predtcols[i], numeric, continuous, formula(postdt:column(postdtcols[i]) - predt:column(predtcols[i])));
);Tabla de datossecuencias de comandosRe: Referenciar columnas de otras tablasEso es fácil de comprobar. Haga doble clic en el encabezado de la columna en JMP y se abrirá la ventana Col Info. Tendrá el nombre real de la columna en la lista.Re: Referenciar columnas de otras tablasImporté los nombres de las columnas de una hoja de Excel (salida de nuestro probador), así que creo que están enterrados en los nombres de las columnas
Re: Referenciar columnas de otras tablasLas unidades (definidas como una propiedad de columna) no forman parte del nombre de la columna.
Re: Referenciar columnas de otras tablasah parece que todas mis columnas después de la columna 2 tienen un (xxx) en el nombre: las unidades de medida.¿Eso podría ser?El registro arroja un error para cada columna como esa
Re: Referenciar columnas de otras tablasSupongo que es un problema de datos.El código funcionó bien para mi caso de prueba con 2 columnas, pero está escrito para manejar tantas columnas como encuentre en la variable "predt"
For( i = 1, i <= N Cols( predt ), i++,
Entonces, lo que debe hacer es revisar el código y verificar los valores de las variables y ver qué está sucediendo.Sin sus datos publicados en esta discusión, no sé qué está pasando.
¿Hay algún mensaje que se muestre en el registro?
Re: Referenciar columnas de otras tablas¡Gracias por la rápida respuesta!Parece que solo obtengo los deltas de las dos primeras columnas con este script.Las columnas tienen el mismo formato que el resto (numérico, continuo), por lo que no estoy seguro de lo que está pasando aquí.
Re: Referenciar columnas de otras tablasTuviste un par de problemas que te estaban molestando (juego de palabras) en el trasero.
- Necesitas << Add Rows() a la tabla de datos vacía;
- El formato para usar la función Column() no es postdt:column(postcols[i]).Si este fuera el método a utilizar en esta situación, la forma sería Column(postdt, postcols[i]).Pero eso no es lo que se necesita aquí.
- La asignación de fórmulas en las operaciones New Column() es un poco complicada.La fórmula () que se establece no se evalúa antes de que se convierta en la fórmula.Es decir, si coloca postcols[i] en una fórmula, no busca el valor de postcols[i] mientras construye la fórmula, simplemente coloca postcols[i] en la fórmula y luego intenta ejecutarlo cuando se ejecuta la fórmula.El problema con esto es que, dado que la variable "i" se reasigna una y otra vez en un bucle, todas las fórmulas a las que se hace referencia "i" se modifican cada vez que se cambia "i" dentro de JSL.Eso no es lo que quieres.Entonces, lo que debe hacerse es evaluar en JSL la cadena exacta de código que desea y luego ejecutar ese JSL para crear la nueva columna.Puede ver eso en el JSL corregido a continuación
predt = data table("one");//Open( "C:\...\pre_data.jmp" );
predtcols = predt << Get Column Names( string );
postdt = data table("two");//Open( "C:\...\post_data.jmp" );
postdtcols = postdt << Get Column Names( string );
dt = New Table( "delta_values" );
dt << add rows(nrows(postdt));
For( i = 1, i <= N Cols( predt ), i++,
Eval(
Parse(
"dt << New Column( \!"delta_" || predtcols[i] || "\!",
numeric,
continuous,
formula( postdt:" ||
postdtcols[i] || "[Row()] - predt:" || predtcols[i] || "[Row()]) )'"
)
)
);
dt << delete columns("column 1");