Hola a todos,
No estoy seguro de que esto sea posible, pero pruebo suerte.
Me gustaría crear (en jsl) una especie de cuadro de tabulación cruzada, pero personalizado con mis propios valores. Para hacerme entender mejor:
Aquí hay una tabla (FIG. 1) que contiene los datos que quiero mostrar:
FIG. 1 - TabulateFIG. 1 - TabulateHIGO. 1 - Tabular
Esto está bien, pero no es exactamente lo que quiero. Lo que me gustaría obtener es algo similar al cuadro de tabulación cruzada que obtenemos cuando llamamos a un análisis de contingencia, como en la FIG.2:
FIG.2 - contingency tableFIG.2 - contingency table FIG.2 - tabla de contingencia
PERO en lugar de "Contar", "% total", etc., pondría en las celdas los valores medios que corresponden a las columnas de mi análisis en tabulado.
Las características que me gustan de este diseño y que no tengo en la versión tabulada son:
- la posibilidad de mostrar varios valores en una celda (y mostrar la leyenda en la esquina superior izquierda)
- el tono en los encabezados de columnas Y filas
- la ausencia de la línea "media" debajo de los encabezados de las columnas
No pude encontrar una manera de convertir mi tabulado en lo que quiero usando el cuadro de tabulación. ¿Crees que sería posible?
Gracias
Puede recrear Tabulate con bastante facilidad utilizando TableBox y ColSpan Boxes. Vea a continuación un ejemplo.
Names Default To Here( 1 );
New Window( "Col Span Box",
Table Box(
Number Col Box( "CAT_ECH", {1, 2, 3} ),
Col Span Box(
"CAT_MK",
Col Span Box(
"0-100",
Col Span Box("COUT_TOT_ENVIRONNE",Number Col Box( "Mean", {1, 2, 3} )),
Col Span Box("TEMPS",Number Col Box( "Mean", {1, 2, 3} )),
Col Span Box("COUT_CONSOS",Number Col Box( "Mean", {1, 2, 3} ))
),
Col Span Box(
">=100",
Col Span Box("COUT_TOT_ENVIRONNE",Number Col Box( "Mean", {1, 2, 3} )),
Col Span Box("TEMPS",Number Col Box( "Mean", {1, 2, 3} )),
Col Span Box("COUT_CONSOS",Number Col Box( "Mean", {1, 2, 3} ))
)
)
)
);
Así es como se ve el método Col Span Box:

Dado que CrossTabBox DisplayBox no se puede programar mediante JSL, necesitaría usar un método diferente para recrear algo parecido a lo que se usa en la plataforma Contingence.
Puedes hacer esto usando un concepto en el que he estado trabajando para usar LineupBox para crear tus propias tablas personalizadas. Este método utiliza una función personalizada para la creación de cada celda para evitar mucha duplicación de código. Vea mis comentarios para más detalles.
//helper function to create cells in the lineupBOx "table"
getCell = Function( {values, altShading, justify = "left"},
{Default Local},
// Create a lineup box to add each of the values to
lb = Lineup Box( N Col( 1 ), SPacing( 0 ) ); // 1 column and no spacing
// loop through and add each value
For( i = 1, i <= N Items( values ), i++,
// if justify is left, put the spacer box on the right, otherwise, put it on the left
If( justify == "left",
// borderBox to give values some spacing (and for shading)
b = Border Box( Right( 5 ), Left( 5 ), top( 1 ), bottom( 1 ),
H List Box(
//Text box with current value
Text Box( values[i] ),
// Spacing to fill the cell shading all the way to the right (will grow horizontally, but not vertially)
Spacer Box( <<SET max="" size="">=100", "", "", ""}, 0 ),
getCell( {"Total", "", "", ""}, 0 ),
//Row 2
getCell( {"0-250", "", "", ""}, 0 ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
//Row 3
getCell( {"250-3000", "", "", ""}, 0 ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
//Row 4
getCell( {">=3000", "", "", ""}, 0 ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
getCell( {"13", "30.95", "43.33", "68.42"}, 1, "Right" ),
//Row 5
getCell( {"Total", ""}, 0 ),
getCell( {"13", "30.95"}, 1, "Right" ),
getCell( {"13", "30.95"}, 1, "Right" ),
getCell( {"13", "30.95"}, 1, "Right" )
)
)
)
)
)
);</SET>
Así es como se verá la ventana resultante con este método:
