如何根据连续 n 行条件定义新列大家好,
我正在寻找其元素取决于至少 10 个连续行的其他列完全填充阈值的公式列。 请参阅所附图像和数据。 这些还包括所需的列“正确的故障区域”。
请任何帮助。
谢谢, HSS

脚本回复:如何根据连续 n 行条件定义新列我可能会将算法分为三个部分:
- 当有足够的值超过 750 时增加计数器(可能设置一些支持变量)
- 当甚至有一个值低于 750 AFTER 时增加计数器并且对每个步骤仅执行一次 1. 增加(可能设置一些支持变量)
- 不要增加计数器(可能设置一些支持变量)
这可能是最简单的(也许不是最简单的,但最清楚的)与一些额外的支持变量有关。
也许是这样的:
If(Row() == 1,
counter = 1;
allow_over_limit_change = 1;
allow_below_limit_change = 0;
);
current_vals_to_check = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit_count = Sum(current_vals_to_check >= 750);
If(allow_over_limit_change & over_limit_count >= 10,
counter++;
allow_below_limit_change = 1;
allow_over_limit_change = 0;
, allow_below_limit_change & :Current < 750,
counter++;
allow_below_limit_change = 0;
allow_over_limit_change = 1;
);
counter;
Row() == 1 if 语句最有可能被替换为这个(在我看来不如使用 If 语句那么清楚)
As Constant(counter = 1);
As Constant(allow_over_limit_change = 1);
As Constant(allow_below_limit_change = 0);
回复:如何根据连续 n 行条件定义新列你好@jthi ,
我根据我的新要求尝试了一些东西。 它可能不是最好的解决方案,但它是一种变通方法。 它非常接近您为原始问题建议的解决方案。 到目前为止它工作正常。
If( Row() == 1, val = 1 );
Next_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() + 9 ) )] >= 750 );
Previous_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() - 9 ) )] >= 750 );
If(
Next_10_values == 10 & Lag( :Current ) < 750 | Previous_10_values == 9 & :Current < 750 &
Lag( :Current ) >= 750,
val = val + 1
);
val;
非常感谢您的支持。
问候, HSS
回复:如何根据连续 n 行条件定义新列如果需要,更改用于增加 val。 对于问题三,随着条件的变化,需要对算法进行一些重写
回复:如何根据连续 n 行条件定义新列@jthi感谢您的解释。
我一行一行地运行它,得到了很多。
我仍然不知道为什么我们在脚本中有变量“更改”,它的目的是什么? 当我们连续获得超过 10 个满足当前值的条目时,它只取两个值,1(作为设置值)和 0。 但它不会出现在新列索引中的任何地方。 但是,如果我在没有变量“更改”的情况下运行它,我将无法获得正确的条目。 但我无法弄清楚它如何以及在何处影响我们的计算/索引。
和问题的第三部分 - 当所需区域 :current>=750 结束时,如何增加运行索引?
谢谢,高铁
回复:如何根据连续 n 行条件定义新列我建议做的是将脚本修改为这样的内容,这样您就可以“逐行”运行它:
// Names Default To Here(1);
// Clear Log();
dt = Current Data Table();
run_script = Expr(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
show(row(), val, change, next_vals, over_limit);
Write("\!N");
);
Row() = 1;
run_script;
Row() = 2;
run_script;
Row() = 5;
run_script;
然后,您可以相当轻松地分段运行脚本并查看日志以查看发生了什么(如果需要,您也可以一次运行一行)。
脚本窗口和嵌入式日志:

脚本索引也有助于解释函数,例如 Dim()。
如果这还不够帮助,请在这篇文章中发表评论并标记我,我可以尝试更详细地解释它。
回复:如何根据连续 n 行条件定义新列上一条消息中的附件图像有误。 请忽略最后一个红色矩形,因为我错误地更改了旧要求的计数器。 事实并非如此。
谢谢,高铁
回复:如何根据连续 n 行条件定义新列嗨 Jarmo 和所有,
这段代码工作正常,我能够在脚本中完美地实现它。
但另一方面,我无法理解它。 我想稍微修改一下,但做不到。 你能帮我吗 -
1. 这个声明是做什么的 -
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
2. 我无法理解“变化”的增量在哪里发生以及如何满足这个条件?
If(change & over_limit >= 10,
我相信它与 - "If( change >=10 & over_limit >=10
3. 在我当前的问题中,一旦所需区域完成(最少 10 个条目),我想将计数器增加一个 - 就像这样 -

有什么帮助吗?
谢谢,高铁
回复:如何根据连续 n 行条件定义新列谢谢亚尔莫,
它工作得很好。 现在我必须将它整合到我的脚本中。 我希望我能做到。
谢谢,高铁
回复:如何根据连续 n 行条件定义新列数据表下标是一种选择。
我更改了当前列名称:
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("a", Numeric, Ordinal,
<< Set Each Value(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
)
);