Column 그룹별 Dif/Lag 기능 사용 방법<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하세요 JMP 커뮤니티 여러분,
Box, iClass, BinPos 및 Slot과 같은 4개의 열이 있는 데이터 테이블이 있습니다.iClass는 제품의 24단계를 의미하고 BinPos는 분류 장비의 Box 위치를 의미하며 Slot은 제품이 상자에 배치되는 슬롯 위치를 나타냅니다. 이 상자는 최대 100개의 제품을 담을 수 있도록 설계되었으며, 이후 새로운 빈 상자가 들어갑니다. 제품이 올바른 상자에 배치되고 슬롯 증분이 정확히 "1"인지 확인하기 위해(언젠가 수동으로 슬롯 증분 증가 >1 또는 증분=0을 관찰했는데 이는 배치 기계에 문제가 있음을 의미함) 증분을 확인하기 위해 dif/lag 기능을 사용하려고 했습니다. 그러나 dif/lag 공식은 Box의 열별로 그룹화하는 기능을 추가하는 것을 허용하지 않습니다. 상자는 실제로 고유 식별자입니다.
Dif(:Slot,1) 과 같은 수식을 사용하면 그 앞의 행과 관련하여 b/wa 확실한 차이를 알 수 있습니다. 그러나 iClass 열에 속하는 제품의 등급이 다르기 때문에 다른 Box와 행이 섞여 있습니다.
나는 Dif(:Slot, 1, :Box) 와 같은 공식이 있기를 바랍니다. 전문가가 이 문제를 해결하기 위한 단서를 제공할 수 있습니까? 조사를 위해 예제 테이블이 첨부되어 있습니다.
미리 감사드립니다.
| 상자 | 아이클래스 | BinPos | 슬롯 |
| 72813_2 | 11 | 11 | 64 |
| 73213_2 | 15 | 15 | 2 |
| 73213_2 | 15 | 15 | 삼 |
| 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 | 삼 |
| 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: Column 그룹별 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: Column 그룹별 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: Column 그룹별 Dif/Lag 함수 사용 방법짐,
다시 가져옵니다. Get Rows Where 식을 모르기 때문에 수식이 작동하지 않았습니다. 열 유형(날짜였기 때문에 별로 신경쓰지 않았습니다)을 숫자로 변경하자마자 Get Rows Where가 마음에 들지 않더라도 작동했습니다.
기본적으로 내가 하려는 것은 Column으로 이전 날짜를 찾는 것이다.
다양한 도구에 대한 부품 교체 내역 표가 있습니다.
| 도구 | 부분 | 설치 날짜 | 삭제 날짜 |
| 도구 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일 | ??? |
| | | | |
따라서 동일한 도구와 동일한 부품에 대해 NEXT 설치 날짜를 가져와서 현재 부품에 대한 제거 날짜로 넣어야 합니다.
이제 실제로 NEXT 날짜를 찾는지 어떻게 확인하는지 모르겠습니다. 수식은 제한된 관찰에서 알 수 있듯이 최소한의 수정으로 작동하지만 수식을 이해하는 한...
이것을 청소하는 것을 도와주시겠습니까?
감사해요,
중.
Re: Column 그룹별 Dif/Lag 함수 사용 방법짐,
이것은 존재하지 않는 수식 ColLag()의 기능을 제공하므로 매우 유용한 해결 방법입니다. 
그러나 이 해결 방법을 게시한 지 꽤 오래되었습니다. 요즘 JMP 14는 작성 방식이 마음에 들지 않습니다. Get Rows Where는 알 수 없는 함수이며 수식에서 Current Data Table()을 사용하는 것이 안정적이지 않다고 합니다.
이 해결 방법의 최신 버전이 있습니까?
감사해요,
중.
Re: Column 그룹별 Dif/Lag 함수 사용 방법더 정확한 타이밍이 필요한 경우 @msharp는 최근 게시물에서 다음과 같이 언급했습니다.
Today()는 초까지만 정확하고 Tick Seconds()는 1/60초까지 정확하며 HP TIME()은 마이크로초까지 정확합니다.
Re: Column 그룹별 Dif/Lag 함수 사용 방법그렇게 많은 행이 있으면 정렬 방법을 사용하는 것이 더 빠를 것입니다.다음은 스크립트에 걸리는 시간을 찾는 데 사용하는 방법입니다.
시작 = 오늘();
타이밍을 찾으려는 스크립트 또는 스크립트의 일부
show(오늘() - 시작);
Re: Column 그룹별 Dif/Lag 함수 사용 방법안녕 짐,
도와 주셔서 감사합니다. 실제로 제공한 수식을 실행하면 시간이 상당히 오래 걸리는 단일 일일 테이블에 60,000개 이상의 행이 있습니다.
먼저 데이터를 정렬한 다음 수식을 실행하면 더 빠를까요?
Btw, jmp가 스크립트나 수식에 대해 실행되는 시간을 계산하는 방법이 있습니까?
문안 인사,
Re: Column 그룹별 Dif/Lag 함수 사용 방법예제는 JSL 독립 실행형 스크립트가 아닌 새 테이블에 대한 수식입니다.새 열을 만들고 열의 수식에 수식을 붙여 넣으면 원하는 증분 값이 생성됩니다.



Re: Column 그룹별 Dif/Lag 함수 사용 방법안녕 짐,
귀하가 만든 스크립트를 실행하려고 했지만(전체 스크립트를 복사하여 붙여넣기만 하면 됨) 데이터 테이블에 변경 사항이 없고 생성할 새 열이 없습니다.
귀하의 스크립트로 새 열을 만들려고 했지만 아무 것도 작동하지 않습니다.
이것은 내가 실행하려고 한 스크립트입니다.
나는 = 행();
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: Column 그룹별 Dif/Lag 함수 사용 방법원본 데이터의 절대 순서가 중요하지 않은 경우 데이터를 정렬하고 Dif 함수를 사용하면 됩니다.그러나 다음은 데이터를 정렬하지 않고 증분을 계산하는 데 사용할 수 있는 공식입니다.
나 = 열 () ;
허용 = 현재 데이터 테이블 () << 행 가져오기 ( : 상자 == : 상자 [ 나 ] ) ;
만약에 ( 위치 ( 목록으로 ( 허용 ) , 나 )[ 1 ] == 1 ,
1 ,
슬롯 [ 허용 [ 위치 ( 목록으로 ( 허용 ) , 나 )[ 1 ]]] - 슬롯 [ 허용 [( 위치 ( 목록으로 ( 허용 ) , 나 )[ 1 ]) - 1 ]]
) ;
Re: Column 그룹별 Dif/Lag 함수 사용 방법:Box로 정렬한 다음 :Box==Lag(:Box,1)을 확인한 후 수식을 적용할 수 있습니까?