希望根據其他列的某種模式產生兩列大家好,
我希望根據其他兩列(「必需的列 1」和「必要的列 2」)中的模式產生兩個新列。 請參閱附圖 -

有什麼幫助/建議嗎?
謝謝。
品質和工藝工程回覆:希望根據其他列的某些模式產生兩列謝謝@jthi以獲得很好的解釋。
回覆:希望根據其他列的某些模式產生兩列1.也許這張圖片解釋了為什麼第一個想法行不通(如果我沒記錯的話,第二個解決方案依賴於此,如果你計算。 + 1這將是。 

我確實從 If 語句中進行了不同的比較,並從中創建了公式,這樣就可以更容易地看到什麼返回 True 以及何時返回 True。
您很可能會透過稍微修改比較來獲得第一個解決方案(缺少(:開始結束) & Lag(:StartEnd) != "結束" | :StartEnd == "結束", val += 1 )。 但透過此更改,您還必須對第二個比較進行小更改(新增 Row() != Col Max(Row()) 檢查)。
2. 想法Row() == Col Max(Row()) & :StartEnd == "開始"只是為了檢查我們是否位於表格的最後一行並且 :StartEnd 值為“Start”,我們不會根據先前的 if 語句將該值設為 1。 Row() 將告訴您行號,而 Col Max(Row()) 將傳回資料表中的最大行號。 可能有點不必要的檢查,因為它是表的最後一行(就像後面帶有開始/結束的行),但由於它在結果列中,我確實實現了它們。
最後一個 if-else 的整體思路如下:
1. Lag(:StartEnd) == "End" -> 這是 End 計數後一般的“停止”
2. Row() == Col Max(Row()) & :StartEnd == "Start" -> 防止在最後一行為 Start 時回傳 1
3. :StartEnd == "Start" & Lag(:StartEnd, -1) == "End" -> 防止在 Start 和 End 之間沒有行的情況下回傳 1 和 2
您可以透過稍微移動一些比較來只使用一個 if 進行多次比較(這似乎會傳回與 Req1 相同的結果):
If(
Row() == 1, val = .,
Row() != Col Max(Row()) & :StartEnd == "Start" & Lag(:StartEnd, -1) != "End", val = 1,
Is Missing(:StartEnd) & Lag(:StartEnd) != "End" | :StartEnd == "End", val += 1,
val =.
)
希望解釋不要太混亂
回覆:希望根據其他列的某些模式產生兩列大家好,
還有另一個查詢,實際上是兩個 -
1. 如果我在單一「If」語句中新增多個條件與使用單一條件新增多個「If」語句有什麼不同。 請參閱附圖 - 。 第一種情況沒有給出正確的結果,而第二種情況工作正常。 結果可以在隨附的範例資料中看到。 我很難理解這裡的差異。
對我來說,似乎每一行 - 在第一種情況下,如果條件為真,則給出輸出。 結果到此結束。
而在第二種情況下,它將順序運行所有 3 個 if 語句,而不管前一個 if 語句的結果如何,並且輸出將基於最後一個 true 條件。 我不確定我是否能夠正確解釋它。 再說一遍,我猜在第二種情況(多個 if 語句)中,前面的 If 語句有某種覆蓋!

2. 上面的公式中用到了一個條件-「 Row() == Col Max(Row()) & :StartEnd == "Start" " 是如何實現的? 它運作良好,意味著 - 寫得很好。 但我無法想像變數/計數器“val”如何停止?
有什麼幫助嗎?
謝謝,
回覆:希望根據其他列的某些模式產生兩列親愛的@jthi (賈莫)和親愛的@tx尼爾森(吉姆),
我真的很感謝您的支持和善意。
我肯定會透過這兩種方法中的任何一種以及這兩種方法的某種組合找到一種工作方式。
再次非常感謝你們倆。
聖誕快樂和新年快樂。 玩得開心。
此致,
哈利
回覆:希望根據其他列的某些模式產生兩列我嘗試了一下。 我盡量避免使用 Lag() 並將其替換為 Col 函數。 最難的公式似乎是必填欄 1如果不使用 Lag() ,我無法快速找出好的公式(很可能有一個使用 Col Cumulative Sum 的解決方案)。 一種想法是用“正在進行”或類似的內容填充開始和結束之間的位置,然後您可能可以更輕鬆地使用“Col Cumulative Sum”,但隨後最困難的公式很可能會移至開始和結束。
看更多... 如果您有時間,我建議測試解決此問題的兩種方法,一種@tx尼爾森提供了對 Lag 和比較的更多使用,以及我對 Col 公式的使用。 兩者肯定都有各自的用例,從長遠來看,理解它們將有助於您在 JMP 中編寫公式/計算。 在某些情況下,當您了解如何將兩者結合時,您可以僅使用公式來解決相當困難的任務。
此外,在邏輯工作後,我很可能會從資料表中刪除公式(或將 Formula() 替換為 << Set Each value in script),因為如果資料表中的順序發生更改,這很可能會中斷。
回覆:希望根據其他列的某些模式產生兩列謝謝@tx尼爾森,
我取得了一些進展 - 並正確識別了每組的起點和終點。 我使用了一個非常簡單的邏輯,你可以在公式列中看到。
但現在我正在努力在每對「開始」和「結束」點之間放置數字。 我在將計數器停止在“結束”時遇到問題。 我的問題可能有同樣的複雜性,但至少現在我在起點和終點上清除了標記/標籤。
有什麼幫助嗎?
謝謝。

謝謝。
回覆:希望根據其他列的某些模式產生兩列問題似乎在於應用於 JSL 變數“other”的邏輯。我今天沒有時間處理這個問題,但明天下午,我應該可以做一些調查。
回覆:希望根據其他列的某些模式產生兩列嗨吉姆,
對困惑感到抱歉。
你原來的公式(我相信,我沒有搞砸)適用於大多數情況,但也捕獲了一些錯誤點,並且錯過了一些完整的數據集。 在附加的資料子集中(僅適用於一個“ID”和一個“子集”值),有一列基於您的公式,其中幾乎沒有錯誤點。
行:647-649 錯誤條目(紅色)
行:868-937 未捕獲(紅色)
行:1307-1311 錯誤條目(紅色)
當我對 :Occurrence 設定條件時,這個問題就得到了解決。
現在我正在尋找——
1. 出現的最後一個主感測器 = n(假設 n = 2),將其標記為“開始”
2. Occurrence = n+1 (= 3) 中的第一個主感測器,如果 n = 3 沒有主感測器,則應停止/標記 Occurrence = n+2 == 4 中的值。 將其標記為“結束”
3. 最後在新欄位中填寫「開始」和「結束」之間的數字。
另一種思考方式(可能是)—
如果我們可以將任何單一出現的 n (n = 2) 第一個主感測器標記為 END,將最後一個主感測器標記為 Start,然後在新列中填入 Start 和 End 之間的值。
我希望這會有所幫助並使事情變得清晰。
謝謝,
我想這可以,如果我能找到一個
回覆:希望根據其他列的某些模式產生兩列我很困惑。從我所看到的來看,我編寫的腳本似乎可以工作,只是在資料表中的第 44 行之後,您更改了規則,並且現在希望 End 位於 Primary 的下一個值之前的行。你想要哪一個?

回覆:希望根據其他列的某些模式產生兩列你好@tx尼爾森, 感謝您的答覆。
我無法獲得正確的(更新的要求)起點。 在資料表(「更新的樣本資料」)和影像中,我手動輸入了更正的資料列。
公式。 我曾經得到“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;

非常感謝。
回覆:希望根據其他列的某些模式產生兩列您已修改了我之前提供的程式碼,以取得您在最近的回覆中提供的結果。 請提供您用於取得範例資料表中顯示的結果的 JSL。
回覆:希望根據其他列的某些模式產生兩列你好@tx尼爾森和所有,
我能夠根據我的要求完美地修改您的程式碼。 但在第二階段故障排除時,我需要這樣的東西——
標記:感測器=“主要”(第一個)圍繞:發生的連續變化。在給定的螢幕截圖中 -
所需值介於兩者之間---最後的“小學”在出現次數 = 2和第一個“小學”在出現次數 = 3 [發生的連續變化]
要找到第一個 Primary 並不難,不知道如何找到最後一個 Primary ? 考慮以某種方式反轉(降序)Occurrence = 2 的子集數據,找到該值,然後將其恢復回來。 無法輸入公式!! 有其他方法可以做到這一點嗎?
有什麼幫助嗎?
謝謝。

回覆:希望根據其他列的某些模式產生兩列你好@tx尼爾森,
它幾乎在很少有錯誤條目的情況下工作。 我相信我們必須在 :Occurrence 列上新增額外的條件。 也就是說 :Occurrence 必須更改為設定 :Required Column 2 == "Start" (並且可能是選項 - 當 :Required Column 2 == "End" 時應該相同)。
類似 - Dif(:Occurrence) !=0 then only :Required Column 2 == "Start"
對於我的範例資料(95 行)來說,您的公式很好,但我的實際資料超過300k 行,它給出了許多錯誤條目,如下所示- (我認為一旦添加對:Occurrence 的附加要求,應該沒問題。 )這只是錯誤條目的一張截圖。

希望!!我可以修改公式/程式碼,並可以新增 :Occurrence 的要求。在你的公式之上。
再次感謝您的支持。
回覆:希望根據其他列的某些模式產生兩列以下是您參考必填列 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;