カラムグループ別Dif/Lag関数の使い方<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />JMP コミュニティの皆さん、こんにちは。
Box、iClass、BinPos、Slot として 4 つの列を持つデータ テーブルがあります。iClass は 24 レベルの製品を意味し、BinPos は仕分け装置内のボックスの位置を意味し、Slot は製品がボックス内に配置されるスロット位置を示します。 ボックスは最大 100 個の製品を収納できるように設計されており、その後は新しい空のボックスが置かれます。 製品が正しいボックスに配置され、スロット増分が正確に「1」であることを確認するために (スロット増分が 1 を超えるか増分 = 0 を超えることを手動で観察したことがありますが、これは配置マシンに問題があることを意味します)、 dif/lag 関数を使用して増分を確認しようとしました。 ただし、差分/遅延式では、ボックスの列ごとにグループ化する関数を追加できません。 ボックスは実際には一意の識別子です。
Dif(:Slot,1) のような数式を使用すると、その前の行との違いが確実にわかります。 ただし、iClass 列に属する製品のレベルが異なるため、異なるボックスの行が混在します。
Dif(:Slot, 1, :Box) のような数式を計算できるようにしたいと考えています。 専門家がこれを解決するための手がかりを提供してもらえますか? 調査のためにサンプルテーブルが添付されています。
よろしくお願いします
| 箱 | iクラス | ビンポス | スロット |
| 72813_2 | 11 | 11 | 64 |
| 73213_2 | 15 | 15 | 2 |
| 73213_2 | 15 | 15 | 3 |
| 73213_2 | 15 | 15 | 4 |
| 73213_2 | 15 | 15 | 5 |
| 73213_2 | 15 | 15 | 6 |
| 73213_2 | 15 | 15 | 7 |
| 73213_2 | 15 | 15 | 8 |
| 73214_2 | 14 | 14 | 1 |
| 73214_2 | 14 | 14 | 2 |
| 73214_2 | 14 | 14 | 3 |
| 73214_2 | 14 | 14 | 4 |
| 73214_2 | 14 | 14 | 5 |
| 73214_2 | 14 | 14 | 6 |
| 73213_2 | 15 | 15 | 9 |
| 73214_2 | 14 | 14 | 7 |
| 73213_2 | 15 | 15 | 10 |
| 73213_2 | 15 | 15 | 11 |
| 73213_2 | 15 | 15 | 12 |
| 73213_2 | 15 | 15 | 13 |
| 73213_2 | 15 | 15 | 14 |
| 73213_2 | 15 | 15 | 15 |
| 73214_2 | 14 | 14 | 8 |
Re: カラムグループごとのDif/Lag関数の使い方ここで先ほどの式を手直ししてみます。この式は JMP 14 で動作します
If( Row() == 1,
dt = Current Data Table()
);
i = Row();
holdBox = :Box;
allrows = dt << get rows where( holdBox == :Box[i] );
If( Loc( As List( allrows ), i )[1] == 1,
1,
:Slot[allrows[Loc( As List( allrows ), i )[1]]] - :Slot[allrows[Loc( As List( allrows ), i )[1] - 1]]
);
Re: カラムグループごとのDif/Lag関数の使い方これは、削除日に関して必要な結果を提供する小さなスクリプトです。
Names Default To Here( 1 );
dt = Current Data Table();
// Add a sequence column to capture the current
// order of the data table
dt << New Column( "tableorder", formula( Row() ) );
// Convert the values in the tableorder column to real values
dt:tableorder << delete formula;
// Sort the table in ascending order
dt = dt << Sort(
By( :Tool, :Part, :Install Date ),
Order( Ascending, Ascending, Ascending ),
replace table( 1 )
);
// Create the Remove Date Column
dt << New Column( "Remove Date", Format( "m/d/y", 10 ) );
// Loop across all of the rows and set the Remove Date
For( i = 2, i <= N Rows( dt ), i++,
If( :Tool[i] == :Tool[i - 1] & :Part[i] == :Part[i - 1],
:Remove Date[i - 1] = :install Date[i]
)
);
// Sort the table back to original order
dt = dt << Sort( By( :tableorder ), Order( Ascending ), replace table( 1 ) );
// Remove the tableorder column
dt << delete columns( "tableorder" );
Re: カラムグループごとのDif/Lag関数の使い方ジム、
取り消します - Get Rows Where 式を認識していなかったため、数式は機能しませんでした。 列の型 (日付なので特に気にしませんでした) を Numeric に変更すると、すぐに機能しましたが、Get Rows Where はまだ気に入らないようです。
基本的に、私がやろうとしているのは、列ごとに前の日付を見つけることです。
さまざまなツールの部品交換履歴の表があります。
| 道具 | 部 | インストール日 | 日付を削除 |
| ツールA | パート1 | 2015/03/03 | ??? |
| ツールB | パート1 | 2015/04/04 | ??? |
| ツールA | パート2 | 2015/05/05 | ??? |
| ツールA | パート1 | 2015/06/06 | ??? |
| ツールA | パート2 | 2015/07/07 | ??? |
| | | | |
したがって、同じツールと同じパーツについては、次回のインストール日を取得し、それを現在のパーツの削除日として設定する必要があります。
さて、実際に次の日付を検索していることをどのように確認するのかわかりません。 限られた観察結果から分かるように、式は最小限の変更で機能しますが、私が式を理解する限りでは、そうではありません...
これをきれいにするのを手伝ってくれませんか?
ありがとう、
M.
Re: カラムグループごとのDif/Lag関数の使い方ジム、
これは、存在しない式 ColLag() の機能を提供するため、非常に価値のある回避策です。 
ただし、この回避策を投稿してからかなりの時間が経過しているようです。 最近の JMP 14 はその書き方が気に入らないようです。 Get Rows Where は不明な関数であると表示され、数式での Current Data Table() の使用は安定していないと表示されます。
この回避策の新しいバージョンはありますか?
ありがとう、
M.
Re: カラムグループごとのDif/Lag関数の使い方タイミングの精度を高める必要がある場合は、@msharp が最近の投稿で次のように述べています。
Today() は秒までしか正確ではありませんが、Tick Seconds() は 1/60 秒まで、HP TIME() はマイクロ秒まで正確です。
Re: カラムグループごとのDif/Lag関数の使い方これだけの行がある場合は、sort メソッドを使用した方が高速です。以下は、スクリプトにかかる時間を見つけるために使用する方法です。
開始 = 今日();
タイミングを調べたいスクリプトまたはスクリプトの一部
show(today() - start );
Re: カラムグループごとのDif/Lag関数の使い方こんにちは、ジムさん
助けてくれてありがとう。 実際、単一の日次テーブルに 60,000 以上の行があり、提供された数式を実行すると、かなり時間がかかります。
最初にデータを並べ替えてから数式を実行した方が早いでしょうか?
ところで、jmp がスクリプトまたは式の実行時間をカウントする方法はありますか?
よろしく、
Re: カラムグループごとのDif/Lag関数の使い方この例は、新しいテーブルの式であり、JSL スタンドアロン スクリプトではありません。新しい列を作成し、その列の数式に数式を貼り付けると、必要な増分値が生成されます。



Re: カラムグループごとのDif/Lag関数の使い方こんにちは、ジムさん
作成したスクリプトを実行しようとしましたが (スクリプト全体をコピーして貼り付けただけです)、データ テーブルに何も変化が見られず、生成する新しい列もありません。
スクリプトを使用して新しい列を作成しようとしましたが、何も機能しません。
これが私が実行しようとしたスクリプトです、
i = 行();
allrows = 現在のデータ テーブル() << 行を取得 where( :Box_ID == :Box_ID );
allrows<< New Column("Test", Numeric, Continuous, Formula(If( Loc( As List( allrows ), i )[1] == 1,
1、
スロット[allrows[Loc( As List( allrows ), i )[1]]] - スロット[allrows[(Loc( As List( allrows ), i )[1])-1]]
)));
よろしく、
Re: カラムグループごとのDif/Lag関数の使い方元のデータの絶対順序が重要でない場合は、データを並べ替えて Dif 関数を使用すると機能します。ただし、データを並べ替えずに増分を計算するために使用できる数式を次に示します。
私=行() ;
許可します=現在のデータテーブル() <<行を取得します。 ( :箱== :箱[私] ) ;
もしも(ロック(リストとして(許可します) 、私)[ 1 】 == 1 、
1 、
スロット[許可します[ロック(リストとして(許可します) 、私)[ 1 ]]] -スロット[許可します[(ロック(リストとして(許可します) 、私)[ 1 ]) - 1 ]]
) ;
Re: カラムグループごとのDif/Lag関数の使い方:Box で並べ替えて、:Box==Lag(:Box,1) であることを確認してから数式を適用できますか?