¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Me gustaría automatizar la creación de varias tablas apiladas a partir de una tabla de datos original. Planeo hacer esto creando una lista de palabras clave y, si alguna columna de mi tabla original contiene esa palabra clave, se apilará en una nueva tabla de datos. Básicamente, tengo una lista de 3 palabras clave, por lo que estaría creando 3 tablas de datos apiladas. Mi script tiene un bucle for anidado para recorrer todas las columnas de la tabla de datos original y ver si contienen la palabra clave que se está indexando. Vea abajo:
groupNames = {"abc", "def", "ghi"};
for (i = 1, i <= nitems(groupNames), i++,
for (j = 1, j <= ncols(Data Table("Original Data")), j++,
if ((contains(Column Name(j), groupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
tempTable = Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
);
tempStack = {};
tempTable << set name(char(groupNames[i]) || " Stacked");
);
El problema que surge al ejecutar este código es que el primer grupo se apila muy bien, pero cuando el bucle for indexa a i=2 para buscar el siguiente grupo, no mira la tabla de datos original y en su lugar mira la tabla que se acaba de apilar (tabla de datos "abc Stacked" en este caso).
¿Cómo puedo hacer para que mi bucle for mire mi tabla de datos original en lugar de la tabla recién creada? ¡Gracias!
Mejor,
kaoticllama
Automatización y secuencias de comandosOrganización de contenidosventanasRe: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Solo necesita especificar usar los datos originales en la entrada de la pila
groupNames = {"abc", "def", "ghi"};
For( i = 1, i <= N Items( groupNames ), i++,
For( j = 1, j <= N Cols( Data Table( "Original Data" ) ), j++,
If( (Contains( Column Name( j ), groupNames[i] )),
Insert Into( tempStack, Column Name( j ) )
)
);
tempTable = data table("Original Data") << Stack(
Columns( tempStack ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
"Non-stacked columns"n( Keep( :tst_temp, :stdf_file ) ),
Output Table( Char( groupNames[i] ) || " Stacked" )
);
tempStack = {};
);Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Hola Jim,
Desafortunadamente ya probé esto y no parece funcionar. Todavía se confunde y piensa que me estoy refiriendo a la tabla recién apilada cuando ejecuto la iteración i=2. Lo puedo decir porque mi tabla recién apilada tiene 4 columnas. El error que recibo es un error de indexación j que falla cuando j=5.

Como referencia, estoy usando JMP Pro 17.2.
Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Puede que te haya confundido al hacer 2 cambios en tu código, pero solo hablo de uno. Cuando realizó su prueba más reciente, ¿usó la línea
tempTable = data table("Original Data") << Stack(
Si lo hizo y luego recibió el error que especificó, le pediré que proporcione una tabla de datos de muestra y exploraré el problema más a fondo.
Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Hola Jim,
No se preocupe, aquí está el código actualizado y los datos de muestra. Todavía no funciona con el cambio que sugeriste.
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Déjame saber lo que encuentres. Gracias
Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Era la función Nombre de columna() la que estaba arruinando el script. Apunta a la tabla de datos activa actual. Por lo tanto, agregué la configuración de la Tabla de datos actuales a la tabla de datos de muestra original.
names default to here(1);
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
Current data table(data table("Sample"));
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Jim,
¡Muchas gracias por tu ayuda en este! Muy bien explicado y funciona perfectamente.
Mejor,
kaoticllama
Re: ¿Es posible crear varias tablas apiladas a partir de una tabla original en un bucle For anidado?Aquí hay otra sugerencia que modificó bastante su script. Utiliza un enfoque un poco diferente usando For Each() (más fácil de leer (en mi opinión) que For()) y una matriz asociativa para recopilar los grupos de columnas.
Names Default To Here(1);
// Initialize Associative Array with groups and empty lists
groups = ["abc" => {}, "def" => {}];
dt = Open("$DOWNLOADS/Sample.jmp");
colnames = dt << Get Column Names("String");
// Collect columns to each key in associative array
For Each({colname}, colnames,
For Each({{group, val}}, groups,
If(Contains(colname, group),
Insert Into(groups[group], colname);
);
);
);
// Loop over the associative array and create the stacked tables
stacked_tables = {};
For Each({{groupname, groupcols}}, groups,
stacked_dt = dt << Stack(
Columns(Eval(groupcols)),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n(Keep(:tst_temp, :stdf_file)),
Output Table(groupname || " Stacked"),
Invisible(1)
);
Insert Into(stacked_tables, stacked_dt);
);
show(stacked_tables);