Ich habe einen Datensatz mit vielen kontinuierlichen Datenspalten und zwei kategorialen Faktoren, nach denen ich in meinem Dashboard filtere, und eine zusätzliche kategoriale Variable (Gruppe), die ich verwende, um alle Diagramme/Analysen aufzuteilen. Ich habe auch einen primären Spaltenumschalter, was bedeutet, dass Benutzer durch eine Übersichtstabelle jeder kontinuierlichen Variablen blättern können. Der primäre Säulenwechsler ist mit allen anderen Säulenwechslern in den Diagrammen und Analysen innerhalb des Dashboards verknüpft. Jedes Diagramm und jede Analyse zeigt also jeweils eine kontinuierliche Variable und kann nach Geschlecht (männlich/weiblich oder beides) gefiltert werden.
Das funktioniert alles gut, aber das Problem tritt auf, wenn ich eine neue Tabelle (dtSumm) erstelle, die die zusammenfassende Statistiktabelle für jede kontinuierliche Variable verwendet und eine neue Variable (Relative Change) berechnet. Diese neue Übersichtstabelle hat nur so viele Zeilen, wie es Kategorien von Gruppen gibt, und enthält kein Geschlecht, sodass wir jetzt die Möglichkeit verlieren, danach zu filtern.
Der Code für dtSumm lautet wie folgt:
// 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 )
);
);
Alle Vorschläge willkommen. Danke
Wahrscheinlich gibt es jetzt einen besseren Weg, aber in der Vergangenheit habe ich 'makeFilterChangeHandler()' verwendet. Also in groben Zügen:
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);Es könnte hilfreich sein, ein Beispiel hinzuzufügen, um die Frage zu veranschaulichen. (Siehe JSL unten)
Das Beispiel verwendet die AdverseR-Daten aus den JMP-Beispieldaten. Das Ziel ist, ein Dashboard wie dieses zu erstellen:

Sie können sehen, dass es einen Datenfilter für SEX gibt. Und es gibt einen Spaltenumschalter, der die „Antwort“-Variable umschaltet, die in den beiden tabellarischen Berichten und der Verteilung zusammengefasst ist.
Die erste Tabelle (links) gibt die durchschnittliche Reaktion für jede Behandlungsgruppe an.
Die zweite Tabelle (rechts) gibt die durchschnittliche prozentuale Veränderung der Reaktion für jede Behandlungsgruppe relativ zur PBO-Gruppe an. Dies geht aus einer zusammenfassenden Tabelle ("dtSumm") der Mittelwerte jeder Reaktion für jede Behandlungsgruppe hervor.
Das Problem ist, dass der Datenfilter für alles außer diesem zweiten tabellarischen Bericht funktioniert. Ideal wäre es, wenn dtSumm nur die Daten zusammenfassen könnte, die die Data Filer-Kriterien erfüllen. Und dtSumm würde neu erstellt, wenn sich die Auswahl im Datenfilter ändert.
Ist das möglich?
// 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]);
);