Hallo,
Einfach ausgedrückt, ich muss nur vom JMP-Format WIDE auf LONG wechseln.
Ich werde BIG CLASS verwenden, um die Grundidee zu skizzieren:
dt = Open( "$SAMPLE_DATA/big class.jmp" );
Grundziel: VORHER strukturieren
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
Struktur NACHHER (sehen wir uns NAME und GESCHLECHT als IDs an)
...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
Jetzt kommt der „Twist“-Teil.Leider ist das Leben kompliziert.
Außerdem ist die Datenlage etwas komplizierter. Fiktive Zeilen zum ursprünglichen BIG CLASS-Inhalt hinzugefügt.
Datensatz VORHER strukturieren
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
Zwischenverarbeitung (Zeilen aggregieren)
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
Strukturieren Sie den Datensatz NACHHER (sehen wir uns NAME und SEX als IDs an)
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
Ich habe JSL-Code basierend auf BIG CLASS geschrieben. Die ersten Reihen funktionieren, aber für die späteren Reihen würde ich mich über Ihre Unterstützung freuen.
Zur Vereinfachung habe ich die relevanten logischen Schritte bereitgestellt, siehe (1) bis (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) ;
Meine eigentliche WIDE-Tabelle hat etwa 100.000 Datenzeilen und ca. 100 Spalten. Alles in allem kann JMP damit rechnen, mehr als 10 Millionen Datenzeilen zu verarbeiten, bis das LONG-Format erreicht ist.
Ich freue mich über jeden Rat.
Vielen Dank!
Neuling
Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe, aber es sieht so aus Zusammenfassung() Und Stapel() könnte den Job machen.
Ergibt das, was Sie suchen? (Sortierung wird anders sein)
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"));