如何按列组使用 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) 后应用公式吗?