列を並べ替えて繰り返し行を削除する方法<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) を置換);
for (i = nrows (dt)、i>0、i--、
if(:ENTITY[i-1]==:ENTITY & :ALARM_ID[i-1] == :ALARM_ID & 日付の差(:ALARM_DATE[i-1], :ALARM_DATE 、「時間」、「小数」) < 1、
dt << 行を削除 (i))
);
dt << save ("SR_Loop_LAM_002_Alarm_Log.csv");
閉じる (dt、保存なし)
Re: 列をソートして繰り返し行を削除する方法皆様、素晴らしい反響をありがとうございました! スクリプトを編集したところ、見事に動作するようになりました。
Re: 列をソートして繰り返し行を削除する方法こんにちは、エヴァンさん
これを回避する方法はいくつかあります。重複の削除には、同じアラームから 1 時間以内に発生した「重複」を削除するという特有の課題があります。これにはラグ関数ロジックが必要であり、実行前にデータを適切に順序付ける必要があります。さらに、次のロジックを実行する前に行を削除すると、ループで範囲外エラーが発生する可能性があります。回避策の 1 つは、重複を削除するためのフラグを設定することです。これは、ブール列を作成するか、いくつかの組み込み機能を使用することで実行できます。以下では、行選択をフラグとして使用するようにコードを変更しました。アラームが重複しているかどうかを判断するロジックが実行された後、すべての行が一度に削除されます。テーブルを非表示モードで開くと、画面 I/O が回避され、速度がさらに向上します。
/* 実行を高速化するためにデータ テーブルを非表示にしました */
dt =開ける( 「SR_Loop_LAM_002_Alarm_Log.csv」 、 見えない) ;
/* 複数のソート用に更新されました */
dt <<選別(による( :実在物、 : ALARM_DATE ) 、注文(上昇、上昇) 、テーブルを置き換える( 0 ) ) ;
/* 最初に行と列の選択をクリアします (良いコーディング習慣です) */
dt <<選択をクリア;
dt <<列の選択をクリア;
/* 指定された条件を満たす行を選択します
これは下から上に進むため、ループは行 1 で停止する必要があります (行 0 はありません)。
*/
のために(私= N 行( dt ) 、私> 1 、私--、
もし(
:実在物[私- 1 】 == :実在物[私] &
: ALARM_ID [私- 1 ] == : ALARM_ID [私] &
日付の違い( : ALARM_DATE [私- 1 】 、 : ALARM_DATE [私】 、 "時間" 、 「分数」 ) < 1 、
dt <<行の選択(私)
)
) ;
/* 選択した行を削除します */
dt <<行の削除;
/* 最終的な並べ替え */
dt <<選別(による( \ : ALARM_DATE ) 、注文(デ上昇する) 、テーブルを置き換える( 0 ) ) ;
dt <<保存( 「SR_Loop_LAM_002_Alarm_Log_cleansed.csv」 ) ;
近い( dt 、保存なし) ;
Re: 列をソートして繰り返し行を削除する方法こんにちはエヴァンチェン870
過去のこのディスカッションを見てください。スクリプトは「get rows where」を使用するため、削除に対しても非常に高速で堅牢です。
Re: ループを停止する
幸運を!
Re: 列をソートして繰り返し行を削除する方法Lag() 関数を使用すると、エラーは発生しません。
lat(エンティティ) は、保存列 (行) を ENTITY[i-1] として指します。
Re: 列をソートして繰り返し行を削除する方法Ian さん、素早い返答ありがとうございます。しかし、スクリプトはまだ私が望んでいることを実行していません。
現在、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--)?
Re: 列をソートして繰り返し行を削除する方法もうすぐそこまで来ているようです。 「for」ループは i=1 の値で終了しますが、インデックス付けは i-1=0 になります。 JMP 添字は常に 1 から始まります。
Re: 列をソートして繰り返し行を削除する方法現在の JMP エラーは、「'subscript' のアクセスまたは評価における行番号が無効です、"ENTITY[i-1]」です。