<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 表示不符合。