Salut,
En termes simples, j'ai juste besoin de passer du format JMP WIDE au LONG.
J'utiliserai BIG CLASS pour décrire l'idée de base :
dt = Open( "$SAMPLE_DATA/big class.jmp" );
Objectif de base : Structure AVANT
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
Structure APRÈS (voyons NOM et SEXE comme identifiants)
...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
Vient maintenant la partie « torsion ».Malheureusement, la vie est compliquée.
De plus, la situation des données est un peu plus compliquée. Lignes fictives ajoutées au contenu original de BIG CLASS.
Jeu de données de structure AVANT
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
traitement intermédiaire (agrégation de lignes)
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
Ensemble de données de structure APRÈS (voyons NOM et SEXE comme identifiants)
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
J'ai écrit du code JSL basé sur BIG CLASS. Les premières lignes fonctionnent, mais pour les lignes suivantes, j'apprécierais votre soutien.
J'ai fourni les étapes logiques pertinentes pour votre commodité, voir (1) à (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) ;
Ma table WIDE actuelle contient environ 100 000 lignes de données et env. 100 de colonnes. Au total, JMP peut s'attendre à gérer +10 millions de lignes de données, jusqu'à ce qu'il arrive au format LONG.
J'accepte tous les conseils.
Merci beaucoup!
Débutant
Je ne sais pas si j'ai bien compris le problème, mais il semble que Résumé() et Empiler() pourrait faire le travail.
Est-ce que cela produit ce que vous recherchez ? (le tri sera différent)
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"));