希望根據其他列的某種模式生成兩列大家好,
我希望根據其他兩列(“Required column1”和“Required Column2”)中的模式生成兩個新列。 請看附圖——

任何幫助/建議?
謝謝。
腳本編寫回复:希望根據其他列的某種模式生成兩列這是您參考必需列 2 的列的公式。當您研究代碼時,您將看到它所做的只是應用您所說的邏輯規則,在確定開始和結束值時需要檢查這些規則。它還包含必需列 1 列的值設置。要運行此公式,只需創建必需列 1 和必需列 2。將必需列 2 設置為字符列。然後打開所需列 2 的公式並將下面的公式複製到列中。

RCValue = "";
:Required Column 1[Row()] = .;
If( :Sensor != "Primary",
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Sensor == "Primary" & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No" & other == "Yes" & Row() !=
N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;
回复:希望根據其他列的某種模式生成兩列你好@txnelson ,
它幾乎沒有錯誤輸入。 我相信我們必須在 :Occurrence 列上添加額外的條件。 也就是說 :Occurrence 必須更改為設置 :Required Column 2 == "Start"(並且可能是選項 - 當 :Required Column 2 == "End" 時它應該相同)。
類似 - Dif(:Occurrence) !=0 那麼只有 :Required Column 2 == "Start"
對於我的示例數據(95 行),你的公式很好,但我的實際數據有超過 300k 行,它提供了許多錯誤的條目,如下所示 - (我認為一旦添加了對 :Occurrence 的額外要求,它應該沒問題。 ) 這只是錯誤條目的截圖之一。

希望!!我可以修改公式/代碼並可以添加:發生的要求。在你的公式之上。
再次感謝您的支持。
回复:希望根據其他列的某種模式生成兩列你好@txnelson和所有,
我能夠完全根據我的要求修改您的代碼。 但是在第二階段的故障排除中,我需要這樣的東西——
在 :Occurrence 的連續變化周圍標記 :Sensor = "Primary" (1st)。在給定的屏幕截圖中 -
之間的必需值---最後一個“初級”在出現次數 = 2和第一個“初級”在出現次數 = 3 [發生的連續變化]
找到第一個 Primary 並不難,不知道如何找到最後一個 Primary? 考慮以某種方式反轉(降序)Occurrence = 2 的子集數據,找到該值然後將其還原。 無法輸入公式!! 任何其他方式來做到這一點?
有什麼幫助嗎?
謝謝。

回复:希望根據其他列的某種模式生成兩列您已經修改了我之前提供的代碼,以獲得您在最近回復中提供的結果。 請提供您使用的 JSL,以獲得您在示例數據表中顯示的結果。
回复:希望根據其他列的某種模式生成兩列你好@txnelson , 感謝您的答复。
我無法獲得正確的(更新的要求)起點。 在數據表(“更新的示例數據”)和圖像中,我手動輸入了更正的數據列。
公式。 我曾經得到“Required Column 1 Old”和“Required Column 2 Old”是這樣的(就像你給我的,我在上面添加了發生條件)-
RCValue = "";
:Required Column 1[Row()] = .;
If( :Occurrence != Lag( Occurrence, -1 ),
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & :Occurrence == Lag( :Occurrence, -1 ) & Dif( :Occurrence ) == 0 &
withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Occurrence != Lag( Occurrence, -1 ) & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No"
& other == "Yes" & Row() != N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;

非常感謝。
回复:希望根據其他列的某種模式生成兩列我很迷惑。從我所見,我寫的腳本似乎可以工作,只是在數據表中的第 44 行之後,您更改了規則,現在希望 End 位於 Primary 的下一個值之前的行上。哪個是你想要的?

回复:希望根據其他列的某種模式生成兩列嗨,吉姆,
對困惑感到抱歉。
您的原始公式(我相信,我沒有搞砸)適用於大多數情況,但也捕獲了一些錯誤點,並且在全套數據中遺漏了一些。 在附加的數據子集中(僅適用於一個“ID”和一個“子集”值),有一列基於您的公式的列幾乎沒有錯誤點。
行:647-649 錯誤條目(紅色)
行:868-937 未捕獲(紅色)
行:1307-1311 錯誤條目(紅色)
當我將條件設置為 :Occurrence 時,此問題已解決。
現在我正在尋找-
1. 出現的最後一個主傳感器 = n(例如 n = 2),將其標記為“開始”
2. 出現次數 = n+1 (= 3) 中的第一個主傳感器,如果 n = 3 沒有主傳感器,則應停止/標記出現次數 = n+2 == 4 中的值。 將其標記為“結束”
3.最後在新列中填寫“開始”和“結束”之間的數字。
另一種思考方式(可能是)——
如果我們可以在任何單個事件中將第 n (n = 2) 個主傳感器標記為 END,將最後一個主傳感器標記為開始,然後在新列中填充開始和結束之間的值。
我希望這會有所幫助並使事情變得清晰。
謝謝,
我想這可以,如果我能找到一個
回复:希望根據其他列的某種模式生成兩列問題似乎與應用於 JSL 變量“other”的邏輯有關。我今天沒有時間處理這個問題,但明天下午,我應該可以做一些調查。