Hola,
Tengo una tabla de datos grande en la que las columnas tienen un número de ID seguido de las palabras como abajo,
| 1-fecha | 1 parámetro | 1-algo | 2-algo | 2 fechas | 2 parametros | 3 parametros | 3 fechas | 3-algo | 3-si no |
| | | | | | | | | | |
| | | | | | | | | | |
Mi objetivo final es automatizar los gráficos de control con la fecha como la etiqueta de muestra. No hay cantidades uniformes de columnas para cada ID y no están ordenadas por fecha ascendente.
Mi idea es dividir la tabla de datos grandes en otras más pequeñas por ID y luego hacer un control de las tablas. Sin embargo, no sé cómo hacer esta división de forma automatizada.
Gracias
La solución de Jim es la solución más general que mencioné, si su tabla no tiene un patrón regular de columnas. La respuesta de Jum solo apareció después de que golpeé a Post.
Charles,
Si su columna tiene una serie regular de 3 (Fecha, Nombre de parámetro, Valores de datos), esto se puede hacer a través de la interfaz de usuario con Menú principal> Tablas> Pila y seleccione una pila de series múltiples, 3, y desmarque pila por fila. Se necesita un poco de limpieza de los nombres de las columnas, pero la tabla resultante se puede usar para los gráficos de control utilizando el Nombre de parámetro o el Grupo de datos como la variable Por.
O si desea tablas separadas, puede usar Subconjunto de tablas en esta nueva tabla, marque Subconjunto por y luego especifique Grupo de datos.
Si su tabla no tiene un orden de serie repetido, se necesita un script o un montón de trabajo manual para subcontratar cada grupo. Responda a esta publicación si su tabla de datos tiene un orden irregular de columnas.
Adjunté una secuencia de comandos JSL que debería funcionar para su tabla si tiene las columnas de series repetidas y todas las fechas y todos los Somethings son del mismo tipo de modelado (probablemente numérico, continuo).
Names Default To Here(1);
dt = current data table();
cnames = dt << get column names("String");
stk = dt << Stack(
columns(
evalList(cnames)
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Stack By Row( 0 ),
Number of Series( 3 )
);
stk:Data << Set Name("Date");
stk:Data 2 << Set Name("Parameter Name");
stk:Data 3 << Set Name("Data");
stk:Label << set each value( trim(word(1,:Label,"-")));
stk:Label << Set Name( "Data Group");
stk << delete columns(:Label 2, Label 3);
Sin más detalles, solo puedo dar una dirección aproximada sobre cómo resolver esto. Veo 2 métodos para ir tras lo que necesitas. Lo primero es averiguar cuántas ID diferentes hay y colocar la columna en las diferentes listas para las ID, haciendo algo como esto:
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Create an ID list
listOfIDs = {};
For( i = 1, i <= N Items( colNamesList ), i++,
If( Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) ) == 0,
// Insert into the listOfIDs, the new ID name
Insert Into( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) );
// Create a list to hold the column names for the new ID
Eval( Parse( "listOfColumns_" || Char( N Items( listOfIDs ) ) || " = {};" ) );
Eval(
Parse(
"insert into(listOfColumns_" || Char( N Items( listOfIDs ) ) || "," || Char(
Column( dt, colNamesList[i] ) << get name
) || ");"
)
);
,
// If the ID has already been see, then just add the column name to the
// ID list of column names
Eval(
Parse(
"insert into(listOfColumns_" || Char(
Contains( listOfIDs, Word( 1, Column( dt, colNamesList[i] ) << get name, "-" ) )
) || "," || Char( Column( dt, colNamesList[i] ) ) << get name || ");"
)
)
)
);
Luego puede recorrer los listOfIDs y hacer su procesamiento.
El otro método sería apilar todas las columnas y luego crear una nueva columna para ID, quitar los valores de ID de las etiquetas y luego dividir las columnas en columnas comunes y realizar el procesamiento utilizando una instrucción By para separar las columnas. diferentes identificaciones Algo como
Names Default To Here( 1 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
// Stack the columns
dtStack = dt << Stack(
columns( colNamesList ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Drop All Other Columns( 1 )
);
// Create the ID Column
dtStack << New Column("ID", character,formula( word(1,:label,"-")));
// Now delete the ID from the :Label column
For Each Row(
:Label = trim(substr( :Label, contains(:Label,"-")+1));
);
// Split back to common columns
dtFinal = dtStack << Split(
Split By( :Label ),
Split( :Data ),
Sort by Column Property
);
Ahora, para mi aclaración ... como dije, con sus escasos detalles, estoy haciendo muchas conjeturas sobre esto. Además, sin una tabla de datos de muestra, el código que proporcioné no se ha probado, y asumo que no funcionaría en la primera ejecución. Está pensado para mostrar una posible dirección que puede tomar para resolver el problema.