안녕하세요, JMP 커뮤니티 여러분,
공통 열인 로트 번호(줄여서 로트)를 공유하는 두 개의 서로 다른 데이터 테이블이 있습니다. (W10에서 JMP Pro 14.1.0 실행)
데이터 테이블은 서로 다른 두 소스에서 왔으며 행 수가 다릅니다. 데이터 테이블 중 하나를 사용하여 다른 데이터 테이블에서 일치하는 행을 선택하고 싶습니다. 로트의 값은 연속적/숫자적입니다. dt1에는 1430개의 행이 있고 dt2에는 158개의 행이 있습니다. dt2보다 dt1에 로트가 더 많기 때문에 dt1에서 일치하는 로트만 선택하려면 dt2를 사용해야 합니다.
나는 간단하게 dt1<
두 개의 for 루프를 사용하면 가능하다고 생각합니다. 여기서 dt1의 각 행에 대해 dt2를 반복하여 두 행이 동일한지 확인합니다. 불행하게도 이로 인해 225940번의 비교가 발생합니다. 이는 쉬울 것이라고 생각했지만 JMP가 훨씬 더 오래 걸립니다. 내가 상상했던 것보다.
이것은 내가 작성한 선택 코드입니다.
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>하지만 작동하지 않습니다. 무한 루프에 빠진 것 같습니다(JMP를 강제 종료해야 함).
이 게시물을 작성하는 동안 약간의 내용을 읽었으며 이전에 선택한 모든 행을 유지해야 하므로 Current Selection("extend") 옵션을 호출해야 합니다. 따라서 위의 코드가 작동하지 않는다는 것을 확실히 알고 있지만 뭔가 조치를 취했어야 했습니다.
For 루프보다 더 빠르고 우아한 작업이 있어야 합니다.
어떤 피드백이라도 대단히 감사하겠습니다.
감사해요!,
DS
이를 수행하는 두 가지 방법이 있습니다.첫 번째 방법은 귀하의 접근 방식을 사용하지만 대규모 데이터 테이블에서는 속도가 느려집니다.
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
두 번째는 더 효율적으로 작동합니다
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );