如何對列進行排序並刪除重複的行<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />剛接觸 JMP 腳本編寫,想要過濾工具錯誤表。 我有一組數據,想要按警報日期進行過濾,然後刪除重複的錯誤行。 例如,如果錯誤在 1:00 發生,並且在 1 小時內重複了 4 次,我想刪除重複,並且僅在錯誤首次出現時捕獲。
我的腳本如下,我想在按警報日期(降序)刪除重複行後重新使用該腳本。
dt = 打開(“SR_Loop_LAM_002_Alarm_Log.csv”);
dt << 排序(按(:ENTITY),順序(升序),替換錶(0));
對於 (i = nrows (dt), i>0, i--,
if(:實體[i-1]==:實體& :ALARM_ID[i-1] == :ALARM_ID & 日期差(:ALARM_DATE[i-1], :ALARM_DATE 、“小時”、“小數”) < 1,
dt << 刪除行 (i))
);
dt << 保存("SR_Loop_LAM_002_Alarm_Log.csv");
關閉(dt,不保存)
回复:如何對列進行排序並刪除重複的行感謝大家的熱烈響應! 我已經編輯了我的腳本,現在它運行得很好。
回复:如何對列進行排序並刪除重複的行嗨埃文,
有多種方法可以解決這個問題。重複刪除存在一個特定的挑戰,因為您希望刪除同一警報一小時內發生的“重複”。這需要滯後函數邏輯,而滯後函數邏輯又要求在執行之前對數據進行適當的排序。此外,如果在執行下一個邏輯之前刪除一行,那麼最終可能會在循環中出現越界錯誤。一種解決方法是設置一個用於重複刪除的標誌,這可以通過創建布爾列或使用一些內置功能來完成。下面我修改了您的代碼以使用行選擇作為該標誌。執行邏輯以確定警報是否重複後,立即刪除所有行。通過以不可見模式打開表格來避免屏幕 I/O,可以進一步提高速度。
/* 數據表不可見以加快執行速度 */
dt =打開( “SR_Loop_LAM_002_Alarm_Log.csv” , 無形的) ;
/* 更新多重排序 */
dt <<種類(經過( :實體, : ALARM_DATE ) ,命令(上升,上升) ,替換錶( 0 ) ) ;
/* 首先清除行和列選擇(只是良好的編碼習慣) */
dt <<清除選擇;
dt <<清除列選擇;
/* 選擇滿足指定條件的行
因為這是從下到上的循環應該在第 1 行停止(沒有第 0 行)
*/
為了(我= N 行( dt ) ,我> 1 ,我--,
如果(
:實體[我- 1 ] == :實體[我] &
:警報ID [我- 1 ] == :警報ID [我] &
日期差異( : ALARM_DATE [我- 1 ] , : ALARM_DATE [我] , “小時” , “分數” ) < 1 ,
dt <<選擇行(我)
)
) ;
/* 刪除選定的行 */
dt <<刪除行;
/* 最終排序 */
dt <<種類(經過( \ : ALARM_DATE ) ,命令(德升序) ,替換錶( 0 ) ) ;
dt <<節省( “SR_Loop_LAM_002_Alarm_Log_cleansed.csv” ) ;
關閉( dt ,沒有保存) ;
回复:如何對列進行排序並刪除重複的行你好埃文辰870
看看過去的討論,該腳本對於刪除也非常快速且強大,因為它使用“獲取行”
回复:停止循環
祝你好運!
回复:如何對列進行排序並刪除重複的行如果您使用 Lag() 函數,您將不會收到錯誤。
緯度(實體) 將指向保存列(行)為 ENTITY[i-1]
回复:如何對列進行排序並刪除重複的行感謝伊恩的快速回复,但腳本仍然沒有達到我想要的效果。
目前,我有列 ENTITY、ALARM_DATE、ENTITY_TYPE、ALARM_ID 和 ALARM_DESCRIPTION
1. 我首先希望我的腳本按 ENTITY、ALARM_DATE 或 ENTITY_TYPE 排序
2.然後我想使用 if 循環刪除 ALARM_DATE 時間差 1 小時內的重複警報(通過 ALARM_DESCRIPTION)
3.最後我想按ALARM_DATE(降序)排序來替換原始表
因此,根據您的建議,我需要更改為(i = nrows (dt), i>1, i--)?
回复:如何對列進行排序並刪除重複的行看起來你已經快到了。 您的“for”循環在 i=1 的值處終止,但您正在索引 i-1=0。 JMP 下標始終從 1 開始。
回复:如何對列進行排序並刪除重複的行當前 JMP 錯誤是“訪問或評估‘下標’時行號無效,“ENTITY[i-1]”