Regularmente escucho de los usuarios de JMP que desean actualizar la tabla de datos con los nuevos datos en lugar de crear una tabla de datos completamente nueva. Esto puede deberse a una variedad de razones: es posible que ya haya limpiado o recodificado algunos datos, que desee mantener su trabajo y análisis anteriores guardados en la tabla de datos, o que simplemente necesite agregar nuevos datos a la tabla de datos existente.
En Parte 1 de esta serie de dos artículos hablé sobre el primer escenario: datos estructurados verticales en una hoja de cálculo. Esto no es demasiado complicado, importe los nuevos datos y concatene con el original (considerando las filas ya importadas).
Hoy quiero hablar de un segundo escenario, que es un poco más complicado. Veo este caso con bastante frecuencia cuando miro los datos del cliente provenientes de, por ejemplo, laboratorios. La tabla de datos estructurados horizontales:

Esa es la primera fila/primera columna es el nombre del parámetro, en las siguientes columnas están los datos. En la segunda fila están las unidades, en la tercera fila el número de lote. Luego una fila vacía y luego lo mismo otra vez para otro parámetro. Esto es más fácil de leer en una hoja de cálculo, pero eventualmente no es muy fácil de analizar. A menudo veo este tipo de datos, aunque sería mucho mejor capacitar a las personas para que ingresen datos de manera vertical que tratar de trabajar con la estructura horizontal.
¿Cómo puede importar y actualizar una tabla como esta en JMP? ¿Qué es tan difícil con esos datos?
Tenemos que entender los desafíos.
- En primer lugar, los datos se organizan en filas, pero el mayor desafío es que hay varias filas que muestran información similar. Parámetros (P1, P2, P3), Unidades y el mismo número de Lote repetido para cada parámetro
- En segundo lugar, tenemos filas vacías para dividir los datos y facilitar la interpretación de qué pertenece a qué.
Para un análisis de datos, este tipo de estructura no es algo que le gustaría a una máquina, necesitaría indicar específicamente dónde se encuentran los datos y realizar el análisis apropiado. Si se agregan nuevos datos a la derecha, debe ajustar los rangos de datos del análisis de manera adecuada.
Debido a estos desafíos, necesitamos procesar los datos antes de llegar a donde queremos estar.
Comencemos a crear la tabla de plantilla que queremos actualizar.
1. Acceda a los datos actuales de la hoja de cálculo tal como son:

2. En realidad, esta no es la tabla que queremos tener, por lo que le cambiamos el nombre a "ayuda" y necesitamos eliminar las filas vacías, como preparación para transponer los datos, en la codificación esto puede verse así:
dt_h1 << Set Name( name_worksheet || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
- Nota: utilicé el comando LOC muy útil para ubicar las filas vacías que se eliminarán
3. La primera columna tiene los nombres de columna reales que queremos tener en los datos finales. Queremos guardarlos para su uso posterior. Luego, podemos transponer la tabla, proporcionarle el nombre final de la tabla (como la hoja de trabajo, ya que me referiré al nombre de la tabla para encontrar automáticamente la hoja de trabajo correspondiente en la hoja de cálculo):
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( name_worksheet || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( name_worksheet )
);

4. Ahora necesitamos hacer algunos cambios en la tabla de datos:
- Eliminar la primera columna
- Eliminar la primera fila
- Cambiar los nombres de las columnas
- Y finalmente configure los datos correctos y los tipos de modelado (debido a la primera fila, todo se ha configurado en caracteres) y guarde el archivo
- Para este ejemplo, también elimine las dos últimas filas para que podamos probar el script de actualización sin agregar columnas a la hoja de cálculo.
- Nota: según la configuración de localización de su sistema, así como el idioma de Office, es posible que deba ocuparse de la configuración de preferencias en JMP o los decimales/comas primero (por ejemplo, con recodificar) antes de cambiar los datos y el tipo de modelo.
La tabla final debería verse así:

Ahora cuidemos el script de actualización.
La mayor parte de lo que necesita ya se ha hecho y guardado en scripts automáticamente:
- El script fuente de importación
- La secuencia de comandos fuente de transposición
- Algunas de las manipulaciones mencionadas anteriormente con ejemplos de script
Echemos un vistazo a la secuencia de comandos de actualización final que pondremos en esta tabla de plantilla como secuencia de comandos:
1. Importar hoja de trabajo con el nombre de la tabla de datos actual
// Read in Sheet2 of the Excel workbook
excelFile = "TransposedExcelWorksheet.xlsx";
// Get the name of the data table and number of existing rows
cdt = Current Data Table();
cdtName = cdt << get name();
n_Rows = N Rows();
// Import the data invisible
dt_h1 = Open(
excelFile,
Worksheets( cdtName ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 1 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
),Invisible
);
2. Realice modificaciones como se describe anteriormente para la tabla de plantilla, transponga y limpie la tabla de datos
dt_h1 << Set Name( cdtName || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( cdtName || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( cdtName )
);
// Clean up data table - delete first row of column names and first column (labels)
dt_final << Select Rows( 1 );
dt_final << Delete Rows();
Column( dt_final, "ColName" ) << Set Selected;
dt_final << Delete Columns();
// Set the Column Names appropriately based on deleted first row in this table
For( i = 1, i <= N Cols( dt_final ), i++,
col = Column( i );
col << Set Name( NewNames[i] );
);
3. Elimine las filas ya importadas y agregue el resto a la tabla de datos original con concatenar:
// remove rows already imported
dt_final << Select Rows( 1 :: n_Rows );
dt_final << Delete Rows();
// Append new data to original data table
cdt << Concatenate( dt_final, Append to first table );
// Close help data table
Close( dt_final );
Close( dt_h1 );<BR />
// this last bracket is to close the whole script!
);
- Nota: No es necesario que se ocupe de los datos y el tipo de modelado, ya que JMP ya sabe cómo tratar los datos debido a las propiedades de las columnas existentes.
Agregar este script a la tabla de datos de la plantilla le permitirá simplemente presionar un botón para obtener los nuevos datos de una estructura de datos horizontal en una hoja de cálculo.
Conclusión
Esto involucró bastantes pasos, algunos fáciles de hacer, algunos más avanzados. Lo bueno es que puedes hacerlo en JMP. Sin embargo, recuerda siempre:
¡La preparación de datos es lo que requiere más tiempo para extraer información de sus datos!
Si desea trabajar con los datos, utilice una estructura adaptada para el análisis de datos.
Eso es la mayoría de las veces un enfoque vertical, donde cada columna representa un parámetro. Pero también se puede hacer un enfoque basado en filas, pero luego, por favor, en uno correcto.
Por poner dos ejemplos que facilitarían el análisis:


- Nota: agregar una nueva columna para el nombre del parámetro elimina la carga de reorganizar los datos importados. Y tiene una variable de agrupación que podría usar como una superposición o por grupo en las plataformas de análisis. Esto evita ejecutar el mismo análisis para cada columna, pero lo hace de una vez.
Por supuesto, puede usar esto y ampliarlo agregando análisis a los datos, como actualizar un gráfico de control u otro análisis de tendencias. Con el Programador de Windows, es posible que desee actualizar su informe y enviarlo a nuestro nuevo producto JMP en vivo , para que otras personas (no necesariamente usuarios de JMP con licencia) puedan acceder a los informes en un navegador web con la interactividad de JMP como filtro de datos, selector de columnas, etc.
No dude en agregar sus casos de uso o enfoques para hacer algo similar. Estoy feliz de echar un vistazo.
Todo lo mejor,
Martín
PD: Tres comentarios a los archivos:
- En Sheet2.jmp encontrará un script para actualizar la tabla de datos con el archivo de Excel adjunto. Ambos archivos deben guardarse en la misma carpeta (esto fue por simplicidad, puede cambiar fácilmente el nombre de archivo codificado con, por ejemplo, Pick File(), y también extraer el nombre.
- El segundo script es "Eliminar las dos últimas filas", que permite eliminar filas en la tabla de datos para actualizar nuevamente desde la hoja de Excel, sin tener que eliminar manualmente las filas. Así que todo para su comodidad.
- El ScriptUpdateHorizontal.jsl creará la tabla de origen inicial con el script de actualización y eliminará los scripts de las últimas 2 filas agregados a la tabla de datos. Este guión también se refiere a la primera parte del blog, por lo que puede seguirlo.