如何按列組使用 Dif/Lag 函數<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />JMP 社區的朋友們大家好:
我有一個包含四列的數據表,分別為 Box、iClass、BinPos 和 Slot。iClass表示24級產品,BinPos表示分揀設備中的Box位置,Slot表示產品放置在箱子中的哪個插槽位置。 該盒子最多可容納 100 個產品,之後將放入一個新的空盒子。 為了檢查產品是否放置在正確的框中,並且槽位增量是否恰好為“1”(因為有時我手動觀察到槽位增量增加>1或增量=0,這意味著放置機有問題),我嘗試使用dif/lag函數來檢查增量。 但是,dif/lag 公式不允許我添加按 Box 列分組的函數。 Box實際上是唯一標識符。
像 Dif(:Slot,1) 這樣的公式可以告訴我相對於它之前的行的 b/wa 差異。 然而,由於屬於 iClass 列的產品級別不同,因此行與不同的 Box 混合在一起。
我希望有一個像 Dif(:Slot, 1, :Box) 這樣的公式來計算。 有哪位專家可以提供一些線索來解決這個問題嗎? 附上一個示例表以供調查。
提前謝謝了
| 盒子 | iClass | 收款機 | 投幣口 |
| 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 |
回复:如何通過列組使用 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]]
);
回复:如何通過列組使用 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" );
回复:如何通過列組使用 Dif/Lag 功能吉姆,
我收回它 - 公式不起作用,因為它不知道 Get RowsWhere 表達式。 一旦我將列類型(它是日期,所以我真的不在乎)更改為數字,它就起作用了,儘管它仍然不喜歡“獲取行位置”。
基本上,我想做的是按列查找上一個日期。
我有一張不同工具的零件更換歷史記錄表:
| 工具 | 部分 | 安裝日期 | 刪除日期 |
| 工具A | 第1部分 | 2015年3月3日 | ??? |
| 工具B | 第1部分 | 2015年4月4日 | ??? |
| 工具A | 第2部分 | 2015年5月5日 | ??? |
| 工具A | 第1部分 | 2015年6月6日 | ??? |
| 工具A | 第2部分 | 2015年7月7日 | ??? |
| | | | |
因此,對於相同的工具和相同的部件,我需要獲取下一個安裝日期並將其作為當前部件的刪除日期。
現在,我不確定如何確保它確實查找下一個日期。 正如我在有限的觀察中所知道的那樣,公式可以進行最小的修改,但據我了解該公式,它不會......
你能幫我清理一下嗎?
謝謝,
M。
回复:如何通過列組使用 Dif/Lag 功能吉姆,
這是一個非常有價值的解決方法,因為它提供了不存在的公式 ColLag() 的功能; 
不過,我發現您發布此解決方法已經有一段時間了。 現在的 JMP 14 不喜歡它的編寫方式。 它說 Get RowsWhere 是一個未知函數,並且它說在公式中使用 Current Data Table() 不穩定。
此解決方法有任何新版本嗎?
謝謝,
M。
回复:如何通過列組使用 Dif/Lag 功能如果您需要更準確的計時,@msharp 在最近的一篇文章中指出:
Today() 僅精確到秒,Tick Seconds() 精確到 1/60 秒,HP TIME() 精確到微秒。
回复:如何通過列組使用 Dif/Lag 功能對於這麼多行,使用排序方法會更快。以下是我用來查找腳本所需時間的方法:
開始=今天();
您想要查找計時的腳本或腳本的一部分
顯示(今天() - 開始);
回复:如何通過列組使用 Dif/Lag 功能嗨吉姆,
謝謝您的幫助。 實際上,我的一個每日表中有超過 60,000 行,如果我運行您提供的公式,將需要相當長的時間。
如果我先對數據進行排序然後運行公式會更快嗎?
順便說一句,有沒有辦法讓 jmp a 計算腳本或公式運行的時間?
問候,
回复:如何通過列組使用 Dif/Lag 功能該示例是新表的公式,而不是 JSL 獨立腳本。創建一個新列,並將公式粘貼到該列的公式中,它將生成您想要的增量值。



回复:如何通過列組使用 Dif/Lag 功能你好吉姆,
我嘗試運行您製作的腳本(只需複制並粘貼整個腳本),但是,我看不到數據表中的任何更改,也沒有生成新列。
我嘗試用您的腳本創建一個新專欄,但也沒有任何效果。
這就是我嘗試運行的腳本,
我=行();
allrows = 當前數據表() << 獲取行 where( :Box_ID == :Box_ID );
allrows<< 新列("測試", 數字, 連續, 公式(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]]
)));
問候,
回复:如何通過列組使用 Dif/Lag 功能如果原始數據的絕對順序不重要,則對數據進行排序並使用 Dif 函數即可。但是,您可以使用以下公式來計算增量,而無需對數據進行排序。
我=排() ;
全部行=當前數據表() <<獲取行,其中( :盒子== :盒子[我] ) ;
如果(洛克(作為列表(全部行) ,我)[ 1 ] == 1 ,
1 ,
投幣口[全部行[洛克(作為列表(全部行) ,我)[ 1 ]]] -投幣口[全部行[(洛克(作為列表(全部行) ,我)[ 1 ]) - 1 ]]
) ;
回复:如何通過列組使用 Dif/Lag 功能您可以按 :Box 排序,然後在檢查 :Box==Lag(:Box,1) 後應用公式嗎?