同じデータ フィルターを複数のテーブルに動的に適用するには、どのような方法がありますか?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、みんな、
現在、JMP を使用してデータ分析ツールを構築しています。 基本的に、JMP を使用して、クライアントが他のソフトウェアを使用して生成されたシミュレーション出力とやり取りできるようにします。
シミュレーション出力は、さまざまな特性を持つ複数のテーブルに格納されますが、識別子は同じです。 たとえば、あるテーブルには 1 つのシミュレーション レプリケーションにグローバルに関連付けられた出力値が保持され、別のテーブルにはシミュレーション レプリケーションに存在する各エージェントに関連付けられた出力が保持され (したがって、レプリケーションごとに複数の行があります)、別のテーブルには次の時間ステップごとの出力が保持される場合があります。各シミュレーション レプリケーション (したがって、レプリケーションごとに多くの行が含まれます)。 すべてのテーブルに共通しているのは、識別子と入力パラメーターを含む列です。
ここでの課題: すべてのデータ テーブルを同時にフィルター処理するデータ フィルターを作成できるようにしたいと考えています (もちろん、これは共有する情報 (識別子など) に基づいて行われます)。 私の根本的な目標は、グラフなどを使用してさまざまなテーブルからの情報を動的に提示できるようにしながら、最も便利なテーブル形式でデータを整理することです。
あなたが持っているかもしれないどんな考えでも、私に知らせてください!
前もって感謝します
Re: 同じデータ フィルタを複数のテーブルに動的に適用するには、どのような方法がありますか?JSL:
http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646
「行状態ハンドラー」を追加して以来(JMP 10だと思います)、かなり古く、(ありがたいことに!)時代遅れです。 これにはさまざまな用途があり、以下のコードはこの場合の悪用方法を示しています。
// ian.cox@jmp.com : 2014年11月3日
// 行状態ハンドラを使用して複数の子テーブルを親テーブルにリンクする方法のデモ
NamesDefaultToHere (( 1 ) ;
// 使用するテーブルをいくつか作成します
dt1 =新しいテーブル(( "表1" 、
新しい列(( 「ID」 、数値、連続、値(( 1 ::: 10 ) ` )) 、
新しい列(( "応答" 、数値、連続、方式((ランダムノーマル(( 0 、 1 ))))
) ;
dt2 =新しいテーブル(( 「表2」 、
新しい列(( 「ID」 、数値、連続、方式((ランダム整数(( 1 、 5 )))) 、
新しい列(( 「属性2」 、数値、連続、方式((ランダム整数(( 0 、 10 )))) 、
AddRows (( 20 )
) ;
dt3 =新しいテーブル(( 「表3」 、
新しい列(( 「ID」 、数値、連続、方式((ランダム整数(( 1 、 11 )))) 、
新しい列(( 「属性3」 、数値、連続、方式(( RandomInteger (( 0 、 100 )))) 、
AddRows (( 30 )
) ;
// 効用関数:
// データ テーブル、その中の列、およびその列のいくつかの値を指定すると、対応するすべての行が選択されます。
// 'col' を数値 (文字) にできるようにする必要があります。この場合、'vals' は行列 (リスト) です。
selectMatchingRows =
関数({ dt 、列、ヴァルス} 、
行2選択= [] ;
もしも(( IsMatrix ((ヴァルス) 、
// 'col' は数値です
為に((私= 1 、私<= NRow ((ヴァルス) 、私++、
行2選択= VConcat ((行2選択、 dt << GetRowsWhere ((列==ヴァルス[私])) ;
)
、
// 'col' は文字です
為に((私= 1 、私<= Nアイテム((ヴァルス) 、私++、
行2選択= VConcat ((行2選択、 dt << GetRowsWhere ((列==ヴァルス[私])) ;
)
) ;
dt <<行の選択((行2選択) ;
) ;
// 「マスター」テーブル (dt1) に割り当てられる行状態ハンドラーを作成します。 複数の行を選択できるようにします。
伝搬選択ToOtherTables =
関数({バツ} 、
// 選択された行を取得
selectedRows = dt1 << GetSelectedRows ;
もしも(( NRow (( selectedRows ) >> 0 、
// 対応する ID を取得します
ID = dt1 : ID [ selectedRows ] ;
// dt2 の対応する行を選択します
selectMatchingRows (( dt2 、式(( : ID ) 、 ID ) ;
// dt3 の対応する行を選択します
selectMatchingRows (( dt3 、式(( : ID ) 、 ID ) ;
、
// 既存の選択をクリア
dt2 << ClearSelect ;
dt3 << ClearSelect ;
) ;
) ;
// ハンドラーを dt1 に割り当てます
rsh = dt1 << MakeRowStateHandler ((伝搬選択ToOtherTables ) ;
Re: 同じデータ フィルタを複数のテーブルに動的に適用するには、どのような方法がありますか?私は、元のアプローチよりもはるかに効率的に問題を処理する方法を見つけました。
dtglobal の行の状態 (含まれているものと選択されているもの) を dt1、dt2、dt3 に転送するには、以下を使用できます。大きなデータテーブルでも高速かつ動的に動作します。 必要なのは、各テーブルに対応する「キー」(数値) を持つ列だけです。
// dtglobal の行の状態を他のテーブルに転送します
statehandler = dtglobal << Make Row State Handler( statetransfer );
statetransfer = Function( {Y},
dt1 << 行の状態をクリアします。
dt2 << 行の状態をクリアします。
dt3 << 行の状態をクリアします。
excluderows = dtglobal << 除外された行を取得します。
excludekeys = dtglobal:Key << 値を取得します。
excludekeys = excludekeys[excluderows];
dt1 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt1 << 除外します。
dt2 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt2 << 除外;
dt3 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt3 << 除外します。
selectrows = dtglobal << 選択された行を取得します。
selectkeys = dtglobal:Key << 値を取得します。
selectkeys = selectkeys[selectrows];
dt1 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt2 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt3 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
)
;
Re: 同じデータ フィルタを複数のテーブルに動的に適用するには、どのような方法がありますか?PMrozさん、お返事ありがとうございます。
私はこの例に似たものを試してきました: http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646 .
テーブル 2 の包含/除外状態がテーブル 1 の状態に依存する 2 つのテーブルを作成しました (将来、これは、選択済み、可視、色などの他の状態を含むように拡張される可能性があります)。
残念ながら、結果はまだ堅牢ではありません。 時々機能しますが、いくつかの行をフィルタリング (包含/除外) したり、何か他のことをしたりした後、機能しなくなります。 現在のデータテーブルに関連している可能性があると思われますが、よくわかりません。 スクリプト ウィンドウから作成した (そして table1 に埋め込まれていない) スクリプトを使用すると、多少堅牢になりますが、それでも何もできない場合があります。
このアプローチをさらに改善する方法についてのご意見をお待ちしております。
添付ファイルの 2 つのテーブルに対してスクリプトを実行するだけで、自分の目で確認できます。 実際にテーブルを接続するために使用するスクリプトも添付ファイルの下部にあります。
簡単な要約:
テーブル 1 とテーブル 2 の両方に列 RepID があります。
表 1 の行が含まれている/除外されている場合、列 :Excluded はこれを行います (何らかの理由で、テーブルを起動した後に dt/dt2 参照が失われるため、ここで再度定義します)。
方式(
If( Excluded( 行の状態( 行() ) ),
dt = データ テーブル( "linktable1.jmp" );
dt2 = データ テーブル( "linktable2.jmp" );
現在のデータ テーブル ( dt );
1;
、
dt = データ テーブル( "linktable1.jmp" );
dt2 = データ テーブル( "linktable2.jmp" );
現在のデータ テーブル ( dt );
0;
)
)
)、
次に column :parser はこれを行います:
If(:Excluded == 1, Eval(Parse(:ScriptEx)), :Excluded == 0, Eval(Parse(:ScriptInc)))
このスクリプトを参照するもの (:ScriptEx 内):
RepIDex = dt:RepID[];
除外リスト = リスト();
Excludelist = As List( dt2 << Get rows Where( dt2:RepID == RepIDex ) );
現在のデータ テーブル ( dt2 );
Eval( For( i = 1, i <= N Items( Excludelist ), i++, Row State( Excludelist ) ) = 除外状態 ( 1 ) ) );
スクリプト全体については、添付ファイルを参照してください。テーブル。
Re: 同じデータ フィルタを複数のテーブルに動的に適用するには、どのような方法がありますか?物事を同時にフィルタリングできるかどうかはわかりませんが、各テーブルにフラグ列を追加できます。1 はこの行がいくつかの基準を満たしていることを意味し、0 はそうでないことを意味します。