改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容你好@jthi ,
我已经尝试过你的第一个建议 - 它按预期工作。 多谢。 最后一行几乎就是我一直在寻找的一句台词!
回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容与乔治的想法类似。 每次选择新列时,请再次运行 EvalEvalExpr()) 部分(如果需要,可以将其制作为脚本/插件/快捷方式)。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//create placeholder for colum
new_col = dt << New Column("Sum_selected", Numeric, Continuous);
//after column selection run this part to update script
Eval(EValExpr(new_col << Set Formula(Sum(Expr(Current Data Table() << Get Selected Columns)))));JMP 没有(据我所知)“列状态处理程序”,因此您无法像处理行那样在列选择更改后触发事件。
您也可以尝试这样的方法,但我建议反对它,并将公式更新移动到按钮按下而不是过滤器列框选择更改,因为这样更容易管理
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
nw = New Window("Update formula",
window:new_col = dt << New Column("Sum_selected", Numeric, Continuous); //create column inside new window
window:dt = dt;
flc = Filter Col Selector(
dt, << character(0), << nominal(0), << ordinal(0),
<< On Change(
show(window:new_col, window:dt);
window:dt << Select columns((flc << Get Selected));
Eval(EValExpr(window:new_col<< Set Formula(Sum(Expr(window:dt << Get Selected Columns)))));
)
)
);回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容亲爱的@单态论者,
也许这有帮助。 当使用大量列时,我发现使用列组是有利的。 下面的示例定义了一个组(可以在脚本索引中找到许多示例),并为该列构建平均公式并实现它。
如果需要,同样可以为选定的列编写脚本。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Blood Pressure.jmp" );
Wait( 1 );
theGroup = dt << Group Columns( "theGroup", :BP 8M :: :BP 12W );
Wait( 1 );
// build an expression for formula with column replacement
formula_expr = expr(dt << New Column( "Mean_of_Group",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( mean( expr(current data table() <<GET column="" group=""></GET>
回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容嗨,DS,
好吧,这就是我到目前为止的做法:循环遍历行,然后为每一行循环遍历列。 不过,我希望有一个更优雅的解决方案。 简单的一句台词......
这是一个具体且非常简单的示例:
我有 50 列,我想计算每一行我选择的列的算术平均值。 假设我选择 3 列 E1、E6 和 E12 来计算平均值。 当我手动执行此操作时,需要花费几秒钟的时间:在数据表中添加一列,选择 3 列并除以 3 -> (:E1 + :E6 + :E12) / 3。
如果我想在脚本中执行此操作,并且希望在我选择的不是 3 列而是 4 或 5 或 20 列的情况下保持脚本有效,我还没有找到任何其他方法 - 无论是在社区还是在JMP 库/脚本指南等 - 而不是垂直循环遍历每一行,然后嵌套水平循环遍历列。 这似乎很笨拙? 另一种选择是编写 49 个不同的宏,每个宏对应所选列的确切数量,也就是说,如果我想选择 7 列,我运行 script7,如果我想选择 21 列,我运行 script21,使用以下公式调整为21项。 我觉得这相当可笑(那么我最好保留我笨重的嵌套循环......)
是否没有 JSL 语法将公式压缩为简单的一行代码,例如:
dt << 新列(“AnyTitle”、数字、连续、公式(Sum_of_all_selected_columns / N_items))?
当可以从 ColDialog ColList 中检索所选列时,表达式/列公式“Sum_of_all_selected_columns”在 JSL 中看起来如何(如果存在?!?),它可能是 :: 位 -> Sum(v1::vn) ,其中 v1 是 ColList 中的第一项,vn 是最后一项,公式对第一项、最后一项以及中间的所有项进行求和,而不需要指定中间有多少项?
我经常遇到这个问题,我希望脚本用先验未知数量的项目来计算某些内容(例如总和或乘积等)。
干杯,
科菲
回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容你好@单态论者,
这是我通过搜索讨论论坛找到的一些修改后的代码。 原帖是这里。
我认为如果您有一个结果列列表(应该很容易生成或获取),那么您应该能够实现类似我修改过的 AddCols 之类的功能来生成您需要的公式。 原来的帖子内容非常丰富且有趣。
Names Default To Here( 1 );
// Make a table
nc = 30;
dt = New Table( "Test" );
For( c = 1, c <= nc, c++,
dt << New Column( "Col" || Char( c ), Numeric, Continuous, Formula( Random Normal() ) )
);
dt << AddRows( 100 );
// Select half the columns
n = Round( nc / 2 );
c = Random Index( N Col( dt ), n );
For( i = 1, i <= n, i++,
Column( dt, c[i] ) << setSelected( 1 )
);
//This part generates the column formulas based on the SelCols list.
SelCols = dt << Get Selected Columns;
For( j = N Items(SelCols), j >= 1, j--,
AddCols = Expr(
dt << New Column( "Sum_" || Char( j ), Formula( Sum( colsTBD ) ) )
);
Substitute Into( AddCols, Expr( colsTBD ), Eval( selCols[1::j] ) );
AddCols;
);
希望这可以帮助!,
DS
回复:改造挑战建议:有关循环或在列表/矩阵/...中查找元素/值的内容我的脚本中有 80% 涉及循环,遍历通常包含 +100k 行和 +50 列的数据集。 根据我设置的条件,脚本可能会提取 2、3、5、10 或 20 个这些列进行各种计算(例如对数比率对),然后将其结果存储在附加的“结果”中“列,也许是 10、20 或 100 列(然后我需要比较相似性......)。 如果我现在想处理结果列,但不知道最终会得到多少列......我该如何编写公式,以便它们始终有效,无论是 2 还是 200要应用的列?
我可以将每个结果列转储到一个列表中,因此我知道我有多少个结果列。 但我仍然不知道如何制定方程(例如 x = n1 + n2 对于 2 列,但 n1 + n2 + .... + nn 对于 n 列)。
干杯,
科菲