ダッシュボード内でフィルタリングするデータの多くの連続列と2つのカテゴリ要素、およびすべてのプロット/分析を分割するために使用する追加のカテゴリ変数(グループ)を含むデータセットがあります。 また、ユーザーが各連続変数の要約テーブルを循環できることを意味するプライマリ列スイッチャーもあります。 プライマリカラムスイッチャーは、ダッシュボード内のプロットおよび分析で他のすべてのカラムスイッチャーにリンクされています。 したがって、プロットと分析では、一度に1つの連続変数が表示され、性別(男性/女性、またはその両方)でフィルタリングできます。
これはすべてうまく機能しますが、各連続変数の要約統計量テーブルを使用して新しい変数(Relative Change)を計算する新しいテーブル(dtSumm)を作成すると問題が発生します。 この新しいサマリーテーブルには、グループのカテゴリと同じ数の行しかなく、Sexがないため、これでフィルタリングする機能が失われます。
dtSummのコードは次のとおりです。
// 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 )
);
);
どんな提案も歓迎します。 ありがとう
質問を示すために例を追加すると役立つ場合があります。 (以下のJSLを参照)
この例では、JMPサンプルデータのAdverseRデータを使用しています。 目的は、次のようなダッシュボードを作成することです。

SEXにデータフィルターがあることがわかります。 また、2つの表形式レポートと分布に要約されている「応答」変数を切り替える列スイッチャーがあります。
最初の表(左)は、各治療群の平均応答を示しています。
2番目の表(右)は、PBOグループと比較した各治療グループの応答の平均変化率を示しています。 これは、各治療グループの各応答の平均の要約テーブル( "dtSumm")から実行されます。
問題は、データフィルターがこの2番目の集計レポート以外のすべてで機能することです。 理想的なのは、dtSummがデータファイラーの基準を満たすデータのみを要約できる場合です。 また、データフィルターの選択が変更されると、dtSummが再作成されます。
それは可能ですか?
// 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]);
);
おそらく今はもっと良い方法がありますが、過去には「makeFilterChangeHandler()」を使用していました。 だから、概要:
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);