J'ai un ensemble de données avec de nombreuses colonnes de données continues et deux facteurs catégoriels que je filtre dans mon tableau de bord, et une variable catégorielle supplémentaire (Groupe) que j'utilise pour diviser tous les tracés/analyses. J'ai également un sélecteur de colonne principal qui signifie que les utilisateurs peuvent parcourir un tableau récapitulatif de chaque variable continue. Le sélecteur de colonnes principal est lié à tous les autres sélecteurs de colonnes sur les tracés et les analyses du tableau de bord. Ainsi, tout graphique et toute analyse montrent une variable continue à la fois et peuvent être filtrés par sexe (hommes/femmes ou les deux).
Tout cela fonctionne bien, mais le problème survient lorsque je crée un nouveau tableau (dtSumm) qui utilise le tableau statistique récapitulatif pour chaque variable continue et calcule une nouvelle variable (Relative Change). Ce nouveau tableau récapitulatif n'a qu'autant de lignes qu'il y a de catégories de groupes, et n'a pas de sexe, nous perdons donc maintenant la possibilité de filtrer en fonction de cela.
Le code de dtSumm est le suivant :
// Create a separate datatable for treatment group means
dtSumm = dt << Summary (
Group (:Group,:Sex ),
Mean ( eval ( cols ) ),
statistics column name format( "column" ),
Link to original data table( 1 ),
invisible
);
// Add RC columns for each column in cols to dtSumm
//This works by getting the mean of each column for treatment group "A"
For( i = 1, i <= num, i++,
mean0 = Mean(Column(cols[i])[(dtSumm << get rows where( :"Group" == "A"))]);
dtSumm << New Column(
Char(cols[i]||"_RC"),
Formula( ( ( ( column( cols[i] )[]) - ( eval(mean0) ) ) / ( eval(mean0) ) ) * 100 )
);
);
Toutes les suggestions sont les bienvenues. Merci
Il peut être utile d'ajouter un exemple pour illustrer la question. (Voir JSL ci-dessous)
L'exemple utilise les données AdverseR des données d'exemple JMP. L'objectif est de produire un tableau de bord comme celui-ci :

Vous pouvez voir qu'il existe un filtre de données sur le SEXE. Et il y a un sélecteur de colonne qui change la variable "réponse" qui est résumée dans les deux rapports Tabulate et la Distribution.
Le premier tableau (à gauche) donne la réponse moyenne pour chaque groupe de traitement.
Le deuxième tableau (à droite) donne le pourcentage moyen de changement de réponse pour chaque groupe de traitement par rapport au groupe PBO. Cela s'exécute à partir d'un tableau récapitulatif ("dtSumm") des moyennes de chaque réponse pour chaque groupe de traitement.
Le problème est que le filtre de données fonctionne sur tout, à l'exception de ce deuxième rapport Tabulate. L'idéal serait que dtSumm puisse résumer uniquement les données qui répondent aux critères du Data Filer. Et dtSumm serait recréé lorsque les sélections dans le filtre de données changeaient.
Est-ce possible?
// Open the data table
dt = Open( "$SAMPLE_DATA/AdverseR.jmp" );
//Define cols as the list of columns for column switcher to use
//This is essentially hard-coding the columns that will be used in the dashboard
//Edit the items in this list to change the columns used in the dashboard
cols = {"DAY ON DRUG", "AGE", "WEIGHT", "ADR DURATION"};
//Define num as the number of columns in the list, cols
num = length(cols);
// We create a separate data table for treatment group means
// Get table, dtSumm, of means by group for each column in cols
dtSumm = dt << Summary (
Group (:Name("TREATMENT GROUP")),
Mean ( eval( cols ) ),
statistics column name format( "column" ),
Link to original data table( 1 ),
invisible
);
// Add RC columns for each column in cols to dtSumm
//This works by getting the mean for "PBO" treatment group for each
For( i = 1, i <= num, i++,
mean0 = Mean(Column(cols[i])[(dtSumm << get rows where( :"TREATMENT GROUP" == "PBO"))]);
dtSumm << New Column(
Char(cols[i]||"_RC"),
Formula( ( ( ( column( cols[i] )[]) - ( eval(mean0) ) ) / ( eval(mean0) ) ) * 100 )
);
);
// Create dashboard with tables and Distribution plot
mainWindow=New Window( "Example",
H List Box(
dt << Current Data Table() << Data Filter(
Location( {55, 48} ),
Mode( Select( 0 ), Show( 1 ), Include( 1 ) ),
Add Filter( columns( :SEX ) ) //
);
,
table1= dt << Tabulate(
Show Control Panel( 0 ),
Add Table(
Column Table(
Analysis Columns(
Column( cols[1] )
),
Statistics( Mean, N )
),
Row Table( Grouping Columns( :TREATMENT GROUP ) )
)
);
,
table2= dtSumm << Tabulate(
Change Item Label( Statistics( Mean, "%Rel Change" ) ),//Changes heading from "Mean"
Show Control Panel( 0 ),
Add Table(
Column Table( Analysis Columns( Char(cols[1]||"_RC") ), Statistics( Mean ) ),
Row Table( Grouping Columns( :TREATMENT GROUP ) )
)
);
,
dist0 = dt << Distribution(
Continuous Distribution(
Column( cols[1] ), //dt_c_col[1] uses first in column list
Always use column properties( 1 ),
Process Capability( 0 )
),
Histograms Only,
SendToReport(
Dispatch( {}, "Distribution", OutlineBox ),
Dispatch( {}, "Process 1", OutlineBox, {Close( 1 )} )
)
)
)
);
// Add a column switcher to table1
cs = table1 << Column Switcher(
cols[1],
cols
);
// Link column switchers at each platform - JMP 15 solution
cs1 = table2 << Column Switcher(
Char(cols[1]||"_RC"),
eval list(dtSumm << Get Column Names( String ))[(num+3)::(num+2+num)],
Close Outline( 1 )
);
cs2 = dist0 << Column Switcher(
cols[1],
cols,
Close Outline( 1 )
);
mainWindow[ListBoxBox( 1 )] << Set Script(
var = mainWindow[ListBoxBox( 1 )] << Get Selected;
cs1 << Set Current(Char(var[1]||"_RC"));
cs2 << Set Current(var[1]);
);
Il existe probablement un meilleur moyen maintenant, mais dans le passé, j'ai utilisé 'makeFilterChangeHandler()'. Donc, en gros :
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Report involving detail-level data
NewWindow("Detail and Summary Data with Local Data Filter", << onClose(Try(Close(dt2, noSave))),
hlb = HListBox(dist = dt << Distribution(Continuous Distribution( Column( :height ) )));
);
// Local data filter
ldf = dist << Local Data Filter( Add Filter( columns( :sex ) ) );
// This script will run each time the filter selection is changed
ldfChange =
Function( {a},
filteredRows = ldf << getFilteredRows;
// Try to close any open ancilary tables
Try(Close(dt2, noSave));
// Make a subset table according to the current selection
dt2 = dt << subset(Rows(filteredRows), Invisible);
// Aggregate the subset table
dt3 = dt2 << summary(Mean(:height), Invisible);
// Update the report
hlb << append(dt3 << Tabulate(Show Control Panel( 0 ), Add Table(Column Table( Analysis Columns( :"Mean(height)"n ), Statistics( Mean ) ))));
);
// Attach the script to the local data filter
rsh = ldf << makeFilterChangeHandler(ldfChange);