<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />大家好,
我目前正在使用 JMP 構建數據分析工具。 基本上,我們將使用 JMP 讓我們的客戶與使用其他軟件生成的模擬輸出進行交互。
模擬輸出存儲在具有不同特徵但標識符相同的多個表中。 例如,一個表保存與 1 個模擬複製全局關聯的輸出值,另一個表保存與模擬複製中存在的每個代理相關聯的輸出(因此每個複制有多個行),另一個表可能保存每個時間步的輸出每個模擬複製(因此每個複制包括許多行)。 所有表的共同點是具有標識符和輸入參數的列。
現在面臨的挑戰:我希望能夠創建一個同時過濾所有數據表的數據過濾器(當然這是基於它們共享的信息(例如標識符))。 我的基本目標是以最方便的表格格式組織數據,同時仍然能夠使用圖表等動態呈現來自不同表格的信息。
您可能有任何想法,請告訴我!
先感謝您
JSL 在:
http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646
因為我們添加了“行狀態處理程序”(我認為在 JMP 10 中),所以它相當陳舊並且(謝天謝地!)已經過時了。 這有多種用途,下面的代碼顯示了在這種情況下如何利用它。
// ian.cox@jmp.com : 03Nove2014
// 演示如何使用行狀態處理程序將多個子錶鍊接到父表
名稱DefaultToHere ( 1 ) ;
// 製作一些要使用的表
dt1 =新表( “表格1” ,
新列( “ID” ,數字,連續的,價值觀(( 1 :: 10 ) ` )) ,
新列( “回复” ,數字,連續的,公式(隨機正常( 0 , 1 )))
) ;
dt2 =新表( “表 2” ,
新列( “ID” ,數字,連續的,公式(隨機整數( 1 , 5 ))) ,
新列( “屬性 2” ,數字,連續的,公式(隨機整數( 0 , 10 ))) ,
添加行( 20 )
) ;
dt3 =新表( “表3” ,
新列( “ID” ,數字,連續的,公式(隨機整數( 1 , 11 ))) ,
新列( “屬性 3” ,數字,連續的,公式(隨機整數( 0 , 100 ))) ,
添加行( 30 )
) ;
// 實用功能:
// 給定一個數據表,其中的一列和該列中的一些值,選擇所有對應的行。
// 需要允許 'col' 是數字(字符),在這種情況下,'vals' 是一個矩陣(是一個列表)。
選擇匹配行=
功能({ dt ,山口,瓦爾斯} ,
行2選擇= [] ;
如果(矩陣(瓦爾斯) ,
// 'col' 是數字
為了(一世= 1 ,一世<= N行(瓦爾斯) ,一世++,
行2選擇= VConcat (行2選擇, dt << GetRowsWhere (山口==瓦爾斯[一世])) ;
)
,
// 'col' 是字符
為了(一世= 1 ,一世<= N項(瓦爾斯) ,一世++,
行2選擇= VConcat (行2選擇, dt << GetRowsWhere (山口==瓦爾斯[一世])) ;
)
) ;
dt <<選擇行(行2選擇) ;
) ;
// 將行狀態處理程序分配給“主”表 (dt1)。 允許多行選擇。
將選擇傳播到其他表=
功能({ X } ,
// 獲取被選中的行
選定的行= dt1 << GetSelectedRows ;
如果( N行(選定的行) > 0 ,
// 獲取對應的ID
身份證= dt1 : ID [選定的行] ;
// 選擇dt2中對應的行
選擇匹配行( dt2 ,表達式( : ID ) ,身份證) ;
// 選擇dt3中對應的行
選擇匹配行( dt3 ,表達式( : ID ) ,身份證) ;
,
// 清除任何現有的選擇
dt2 <<清除選擇;
dt3 <<清除選擇;
) ;
) ;
// 將處理程序分配給 dt1
rsh = dt1 << MakeRowStateHandler (將選擇傳播到其他表) ;
我找到了一種比我原來的方法更有效的方法來處理這個問題。
要將 dtglobal 的行狀態(包括和選擇)傳輸到 dt1、dt2、dt3,您可以使用以下命令,即使對於大型數據表,它也可以快速且動態地工作。 您只需要在每個表中都有一個具有相應“鍵”(數值)的列。
//將dtglobal的行狀態轉移到其他表
statehandler = dtglobal << Make Row State Handler( statetransfer );
狀態轉移 = 函數({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 << 獲取值;
選擇鍵=選擇鍵[選擇行];
dt1 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt2 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
dt3 << Select Where( Contains( Matrix( selectkeys ), :Key ) );
)
;
感謝您的回复 PMroz。
我一直在嘗試類似於這個例子的東西: http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646 .
我創建了兩個表,其中表 2 的包含/排除狀態取決於表 1 的狀態(將來可以擴展為還包括其他狀態,例如選定、可見、顏色等)。
不幸的是,結果還不可靠。 它有時會起作用,但在過濾(包括/排除)幾行或做其他事情后它會停止工作。 我懷疑它可能與當前的數據表有關,但我不確定。 使用我從腳本窗口(而不是嵌入在 table1 中)編寫的腳本稍微更健壯,但有時仍然無法執行任何操作。
非常感謝任何有關如何進一步改進這種方法的想法!
只需為附件中的兩個表運行腳本即可查看。 我用於實際連接表格的腳本也在附件的底部。
簡要總結:
表 1 和表 2 都有一個列 RepID。
如果表 1 中的一行包含/排除列 :Excluded 執行此操作(由於某種原因,啟動表後 dt/dt2 引用丟失,因此我在此處再次定義它):
公式(
如果(排除(行狀態(行()))),
dt = 數據表(“linktable1.jmp”);
dt2 = 數據表(“linktable2.jmp”);
當前數據表(dt);
1個;
,
dt = 數據表(“linktable1.jmp”);
dt2 = 數據表(“linktable2.jmp”);
當前數據表(dt);
0;
)
)
),
然後列 :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)));
整個腳本公司見附件。表。
不知道您是否可以同時過濾事物,但可以向每個表添加標誌列,其中 1 表示該行符合某些條件,而 0 表示不符合。