Ho un set di dati con molte colonne continue di dati e due fattori categoriali che filtro all'interno della mia dashboard e una variabile categoriale aggiuntiva (Gruppo) che utilizzo per dividere tutti i grafici/analisi. Ho anche un commutatore di colonna principale che significa che gli utenti possono scorrere una tabella di riepilogo di ciascuna variabile continua. Il commutatore di colonna principale è collegato a tutti gli altri commutatori di colonna nei grafici e nelle analisi all'interno del dashboard. Quindi, qualsiasi grafico e analisi mostra una variabile continua alla volta e può essere filtrata per Sesso (maschi/femmine o entrambi).
Tutto funziona bene, ma il problema sorge quando creo una nuova tabella (dtSumm) che utilizza la tabella delle statistiche riassuntive per ogni variabile continua e calcola una nuova variabile (Relative Change). Questa nuova tabella di riepilogo ha solo tante righe quante sono le categorie di gruppi e non ha Sesso, quindi ora perdiamo la possibilità di filtrare in base a questo.
Il codice per dtSumm è il seguente:
// 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 )
);
);
Qualsiasi suggerimento è benvenuto. Grazie
Probabilmente ora c'è un modo migliore, ma in passato ho usato 'makeFilterChangeHandler()'. Quindi, a grandi linee:
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);Potrebbe essere utile aggiungere un esempio per dimostrare la domanda. (Vedi JSL sotto)
L'esempio utilizza i dati AdverseR dai dati di esempio JMP. L'obiettivo è produrre una dashboard come questa:

Puoi vedere che c'è un filtro dati su SEX. E c'è un commutatore di colonna che cambia la variabile "risposta" che è riepilogata nei due rapporti Tabulati e nella Distribuzione.
La prima tabella (a sinistra) fornisce la risposta media per ciascun gruppo di trattamento.
La seconda tabella (a destra) fornisce la variazione percentuale media nella risposta per ciascun gruppo di trattamento rispetto al gruppo PBO. Questo viene eseguito da una tabella di riepilogo ("dtSumm") delle medie di ciascuna risposta per ciascun gruppo di trattamento.
Il problema è che il filtro dati funziona su tutto tranne che su questo secondo rapporto di tabulazione. L'ideale sarebbe se dtSumm potesse riepilogare solo i dati che soddisfano i criteri di Data Filer. E dtSumm verrebbe ricreato quando le selezioni nel filtro dati cambiano.
È possibile?
// 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]);
);