Hola,
En pocas palabras, solo necesito pasar del formato JMP ANCHO a LARGO.
Usaré BIG CLASS para delinear la idea básica:
dt = Open( "$SAMPLE_DATA/big class.jmp" );
Objetivo básico: Estructura ANTES
NAME AGE SEX HEIGHT WEIGHT
KATIE 12 F 59 95
LOUISE 12 F 61 123
JANE 12 F 55 74
JACLYN 12 F 66 145
Estructura DESPUÉS (vamos a ver NOMBRE y SEXO como ID)
...NAME SEX SOURCE_COL VALUE
KATIE F AGE 12
LOUISE F AGE 12
JANE F AGE 12
JACLYN F AGE 12
KATIE F HEIGHT 59
LOUISE F HEIGHT 61
JANE F HEIGHT 55
JACLYN F HEIGHT 66
KATIE F WEIGHT 95
LOUISE F WEIGHT 123
JANE F WEIGHT 74
JACLYN F WEIGHT 145
Ahora viene la parte del "giro".Desafortunadamente, la vida es complicada.
Además, la situación de los datos es un poco más complicada. Se agregaron filas ficticias al contenido original de BIG CLASS.
Conjunto de datos de estructura ANTES
NAME AGE SEX HEIGHT WEIGHT
KATIE 12 F 59 95
KATIE 12 F 61 105 <-
LOUISE 12 F 61 123
JANE 12 F 55 74
JANE 12 F 65 84 <-
JACLYN 12 F 66 145
procesamiento intermedio (agregar filas)
NAME AGE SEX HEIGHT WEIGHT NO_ROWS
KATIE 12 F 60 100 2
LOUISE 12 F 61 123 1
JANE 12 F 60 79 2
JACLYN 12 F 66 145 1
Conjunto de datos de estructura DESPUÉS (veamos NOMBRE y SEXO como ID)
NAME SEX SOURCE_COL VALUE
KATIE F AGE 12 1
LOUISE F AGE 12 1
JANE F AGE 12 1
JACLYN F AGE 12 1
KATIE F HEIGHT 60 <- 2
LOUISE F HEIGHT 61 1
JANE F HEIGHT 60 <- 2
JACLYN F HEIGHT 66 1
KATIE F WEIGHT 95 1
LOUISE F WEIGHT 123 1
JANE F WEIGHT 79 <- 2
JACLYN F WEIGHT 145 1
Escribí un código JSL basado en BIG CLASS. Las primeras filas están funcionando, pero para las filas posteriores agradecería su apoyo.
He proporcionado los pasos lógicos relevantes para su conveniencia, vea (1) a (5) .
//*********************************************************///
// Create example data tables to be used in the merging
names default to here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
ColmName = dt << get column names(character, numeric);
show(ColmName) ;
For( i = 4, i <= N Cols( dt ), i++,
current data table(dt);
dt2 = dt << subset( selected rows( 0 ), columns( :NAME, :SEX, Column( i ) ) ));
dt2 << New Column( "SOURCE_VOL", character, set each value(Column( i )) ) ;
Column( dt2, 3) << set name( "Value" );
wait(0);
// (1) Get all of the character columns for concatenating
ColmName = dt << get column names(character, numeric);
show(ColmName) ;
// (2) Splitting in subsets per column, e.g. one for AGE, then HEIGHT, then WEIGHT //
BIG_CLASS_(ColmName[1]) = BIG_CLASS << Subset(all rows, columns(:NAME, AGE (:Name(:ColmName[1])) ), Output Table Name("BIG_CLASS_(ColmName[1])") ) ;
// (3) Adding level info to every subset //
BIG_CLASS_(ColmName[1]) << new column("SOURCE_VOL", Character, Nominal, set each value("ColmName[1]");
imo_pick_1 = :"ColmName[1]" << set name ("Value") ;
// (4) Aggregate per subset //
BIG_CLASS_sub_(ColmName[1]) = BIG_CLASS_(ColmName[1]) <<
Summary( Group(:NAME, :SEX),
sum( :AGE ),
Link to original data table( 0 ),
Freq( "None" ),
Weight( "None" )
);
// (5) Concatenate allsubsets to build LONG data structure //
BIG_CLASS_demo =Data Table(BIG_CLASS_sub_(ColmName[1])) <<
Concatenate(
Data Table( "BIG_CLASS_sub_(ColmName[2])" ),
Data Table( "BIG_CLASS_sub_(ColmName[3])" ),
Create source column) ;
Mi tabla WIDE real tiene alrededor de 100.000 líneas de datos y aprox. 100 de columnas. En general, JMP puede esperar manejar más de 10 millones de filas de datos, hasta que llegue al formato LONG.
Acepto todos los consejos.
¡Muchas gracias!
novato
No estoy seguro de haber entendido el problema correctamente, pero parece que Resumen() y Pila() podría hacer el trabajo.
¿Esto produce lo que buscas? (la clasificación será diferente)
Names Default To Here(1);
//example table
dt = New Table("Class",
New Column("name", Character, "Nominal", Set Values({"KATIE", "KATIE", "LOUISE", "JANE", "JANE", "JACLYN"})),
New Column("age", Numeric, "Ordinal", Set Values([12, 12, 12, 12, 12, 12])),
New Column("sex", Character, "Nominal", Set Values({"F", "F", "F", "F", "F", "F"})),
New Column("height", Numeric, "Continuous", Set Values([59, 61, 61, 55, 65, 66])),
New Column("weight", Numeric, "Continuous", Set Values([95, 105, 123, 74, 84, 145]))
);
//Summary
dtsum = dt << Summary(Group(:name, :sex), Mean(:age), Mean(:height), Mean(:weight), statistics column name format("column"));
// Stack summary table
dtstack = dtsum << Stack(columns(:age, :height, :weight), Source Label Column("Source_Col"), Stacked Data Column("Value"));