Hallo,
Einfach ausgedrückt, ich muss nur vom JMP-Format BREIT auf LANG umsteigen.
Ich werde BIG CLASS verwenden, um die Grundidee zu skizzieren:
dt = Open( "$SAMPLE_DATA/big class.jmp" );
Grundziel: Struktur VORHER
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 SEX 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. Das Leben ist leider kompliziert.
Auch die Datenlage ist etwas komplizierter. Fiktive Zeilen zum ursprünglichen Inhalt der GROSSEN KLASSE hinzugefügt.
Strukturdatensatz VOR
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
Strukturdatensatz NACHHER (sehen wir NAME und SEX als IDs)
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 einen JSL-Code geschrieben, der auf BIG CLASS basiert. Die ersten Zeilen funktionieren, aber für die späteren Zeilen würde ich mich über Ihre Unterstützung freuen.
Ich habe die relevanten logischen Schritte für Ihre Bequemlichkeit 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 aktuelle WIDE-Tabelle enthält ca. 100.000 Datenzeilen und ca. 100 Spalten. Alles in allem kann JMP damit rechnen, +10 Millionen Datenzeilen zu verarbeiten, bis das LONG-Format erreicht ist.
Ich freue mich über jeden Rat.
Vielen Dank!
Neuling