Empiler juste une colonneJ'ai été déçu d'apprendre que JMP nous empêchait d'empiler une colonne. Je comprends qu’empiler une seule colonne n’a aucun sens, cependant, comme il s’agit d’une simple transformation de données, il est logique de vouloir le faire.
Quoi qu'il en soit, je voulais ouvrir la conversation et voir qui pourrait proposer un meilleur travail que moi. Voilà le mien:
Names Default to Here(1);
//Example Data Table
dt = Open( "$SAMPLE_DATA/Decathlon.jmp" );
//col list is list of columns from 1 to n (never an empty list)
colList = {"Javelin", "Pole Vault"};
//Stack columns to prepare data for analysis
if(nitems(colList) > 1,
analysisColsExpr = Expr(columns());
for(i=1; imax=nitems(colList), i<=imax, i++,
col = Column(dt, colList[i]);
insert into(analysisColsExpr, col);
);
dtAnalysis = Eval(Eval Expr(dt << Stack(
Expr( Name Expr( analysisColsExpr )),
Source Label Column( "AnalysisType" ),
Stacked Data Column( "AnalysisValue" ),
Output Table( "Stacked Data" )
)));
close(dt, nosave);
,
//Can't stack only one column adjust columns to match above strategy
dt << New Column("AnalysisType", Character, Nominal, Formula(colList[1]));
column(dt, colList[1]) << Set Name("AnalysisValue");
dt << Set Name("Stacked Data");
dtAnalysis = dt;
);
//Run Analysis
oneway = dtAnalysis << Oneway( Y( :AnalysisValue ), X( :AnalysisType ) );
Bonne chance!
Re: empiler juste une colonneC'est une excellente stratégie qui fonctionne parfaitement dans JMP 13, cependant, dans JMP 12, puisque Name est une colonne Label, elle est automatiquement ajoutée à la colonne Label de la fonction Transpose. Je ne sais pas si c'était un bogue, mais je suis content que cela soit corrigé dans JMP 13. Malheureusement, je suis le seul de mon équipe à avoir JMP 13 actuellement ...
Re: empiler juste une colonneUne autre approche sans condition (en supposant que la table de données originale a plus de 1 lignes):
Names Default To Here(1);
//Example Data Table
dt = Open("$SAMPLE_DATA/Decathlon.jmp");
//col list is list of columns from 1 to n (never an empty list)
colList = {"Javelin", "Pole Vault"};
dtTemp = dt << Transpose(Private, Columns(colList), Label Column Name("AnalysisType"));
stackList = (dtTemp << get column names)[2 :: N Row(dt) + 1];
dtAnalysis = dtTemp << Stack(
Columns(stackList),
Stacked Data Column("AnalysisValue"),
Output Table("Stacked Data")
);
//Run Analysis
oneway = dtAnalysis << Oneway(Y(:AnalysisValue), X(:AnalysisType));
Re: empiler juste une colonneVoici une alternative qui ne perturbe pas la table d'origine s'il n'y a qu'une seule colonne, c'est-à-dire crée une nouvelle table (comme le fait Stack ()) au lieu d'adapter la table d'origine à l'approche.
Names Default To Here(1);
//Example Data Table
dt = Open("$SAMPLE_DATA/Decathlon.jmp");
//col list is list of columns from 1 to n (never an empty list)
colList = {"Javelin", "Pole Vault"};
If(N Items(colList) > 1,
dtAnalysis = dt << Stack(
Columns(colList),
Source Label Column("AnalysisType"),
Stacked Data Column("AnalysisValue"),
Output Table("Stacked Data")
),
dtAnalysis = New Table("Stacked Data",
addrows(N Rows(dt)),
New Column("AnalysisType", character, set each value(colList[1])),
New Column("AnalysisValue", numeric, values(Column(dt, colList[1]) << getvalues))
)
);
//Run Analysis
oneway = dtAnalysis << Oneway(Y(:AnalysisValue), X(:AnalysisType));