如何根據連續 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;
)
);