複数列に基づく場所を選択<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />私が望んでいることを実行するための良い方法があるかどうかはわかりませんが、私は次のような状況があります。
私は毎秒測定値を収集した結果であるデータファイルを持っています。タイムスタンプ列、ステータス列、そしてすべての私のデータ列があります。
status列には、"RAMP"、"WAIT"、および "READ"という3つの異なるエントリがあります。時間によるデータの一般的な順序付けは、例えば、約20行の「RAMP」、それに続く85行の「WAIT」、それに続く9行の「READ」をもたらし、それは次に数十回繰り返す。私が選択したい私の関心領域は、各セクション内の最後の30行で、"WAIT"と表示されています。
明らかに、すべての "WAIT"行、またはファイル全体の最後の30行を選択するのは非常に簡単ですが、各セクションの最後の30行だけを選択する方法はわかりません。
これを解決する良い方法はありますか?
再:複数の列に基づく場所を選択してくださいテーブル名とリスト項目数を取得する方法:
dt = 現在のデータテーブル () ;
dt_name = dt << 名前をつける ;
最初の = { 「あ」 、 "b" 、 "c" } ;
ナイテム ( 最初の ) ;
||を使う文字列を他の文字列と連結するには:
"文字列" || ( dt << 名前をつける )
再:複数の列に基づく場所を選択してください私が知っているもう一つの関数が存在しなければならないが、私は見つけることができない - current data table()がdtに代入できる参照を返すが、私はテーブルの名前を抽出する方法を探している - 私はスクリプトを持っているさまざまなテーブルで実行したいのですが、現在のテーブルで開始してから、"<記述文字列> <現在の名前>"という名前の新しいサブセットテーブルを作成します。出力テーブル名( "string" dt)または( "string" $ dt)が機能することを期待していましたが、そうではありません。私はドキュメンテーションを見て捜しています、しかし私は念のためにこのコメントをそこに捨てることを考えました。
再:複数の列に基づく場所を選択してください欲しいリストを作る方法を見つけました - 追加しました:
last_30_waits = {};
(j = 1、j <= 3、j ++、
(i = 0、i <= 3、i ++、
insertinto(last_30_waits、(wait_end_list- 私))));
dt << Select Rows(last_30_waits);
しかし、私は最適ではないと感じています。また、リスト内のエントリ数を返す関数はありますか?最初のforループの "3"をその関数に置き換えたいのですが、見つけるのに問題があります。
再:複数の列に基づく場所を選択してくださいありがとう、それで私は本当に親密になります、しかし私はもう一つのわかりにくい質問をします - wait_start_list / wait_end_list番号の各ペアの間ですべてを選択するための最良の方法は何ですか?私はこれまでリストを使ったことがありません。(私はスクリプト全般については本当に初めてですが、可能な限り最善を尽くしながら学習しようとしています。)
再:複数の列に基づく場所を選択してくださいこれを行う1つの方法があります。 すべてのWAIT行を検索してから、行番号をループします。 1より大きいギャップがある場合は、セクションの終わりを見つけました。 以下のコードは、各セクションの開始行番号と終了行番号を識別する2つのリストを作成します。 この例のために小さなテーブルを作成しました。変更 ntail パラメータ 30 あなたのデータのために。
dt = 新しいテーブル ( 「温度」 、
行を追加 ( 39 ) 、
新しいコラム ( "状態" 、
キャラクター 、
公称 、
設定値 (
{ "ランプ" 、 "ランプ" 、 "ランプ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "読む" 、
"読む" 、 "読む" 、 "読む" 、 "読む" 、 "ランプ" 、 "ランプ" 、 "ランプ" 、 "待つ" 、 "待つ" 、
"待つ" 、 "待つ" 、 "待つ" 、 "読む" 、 "読む" 、 "読む" 、 "読む" 、 "読む" 、 "ランプ" 、
"ランプ" 、 "ランプ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "待つ" 、 "読む" 、 "読む" 、
"読む" 、 "読む" 、 "読む" }
)
) 、
) ;
wait_rows = dt << 行を取得する ( : 状態 == "待つ" ) ;
番号 = 眉 ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
//取得するWAIT行数
ntail = 4 ;
//これは最後の4つのWAIT行を取得します。 最後の30のWAIT行を取得するには、30に置き換えます
にとって ( 私 = 1 、私 <= 番号 、私 ++、
new_row = wait_rows [ 私 ] ;
//行リストで1より大きいギャップを探します
もし ((( new_row - old_row ) > 1 、
挿入する ( wait_start_list 、 ( old_row - ntail + 1 )) ;
挿入する ( wait_end_list 、 old_row ) ;
) ;
old_row = new_row ;
) ;
//最後の一連のWAITを処理します
old_row = wait_rows [ 番号 ] ;
挿入する ( wait_start_list 、 ( old_row - ntail + 1 )) ;
挿入する ( wait_end_list 、 old_row ) ;
再:複数の列に基づく場所を選択してください残念ながら、私は現在JMPのみで、基本的なSASはありません - しかし提案をありがとう。
再:複数の列に基づく場所を選択してくださいあなたはこれをJMPフォーラムに投稿したので、これが役立つかどうかはわかりません。 基本的なSASを使用している場合、適切なツールを使用すれば比較的短いプログラムです。
データlast_30_waits。
group_num + 1;
n_waits = 0。
(last.statusおよびstatus = 'WAIT')まで実行してください。
測定値を設定します(keep = status)。
未分類ステータス別
status = 'WAIT'の場合、n_waits + 1。
終わり;
**この時点で、group_numはWAITのセットを識別し、n_waitsはグループ内のレコード数を示します。
n_found = 0;
(last.statusおよびstatus = 'WAIT')まで実行してください。
測定値を設定します。
未分類ステータス別
status = 'WAIT'の場合
n_found + 1。
n_found> = n_waits - 29の場合は出力。
終わり;
終わり;
n_foundを削除します。
走る。
がんばろう。