여러 목록 항목을 함께 연결JMP12.2 사용 - 목록에 동일한 수의 항목이 있다고 가정할 때 1:1 방식으로 두 개의 서로 다른 목록에서 목록 항목을 함께 연결하는 빠른 방법을 찾고 있습니다. 이것은 매우 큰 테이블의 For Each Row에 사용되므로 가능하면 반복 함수를 선호하지 않습니다.
다음은 내가 달성하고자 하는 것의 예입니다.
목록1 = {"a","b","c","d","e","f","g"};
목록2 = {"1","2","3","4","5","6","7"};
허용되는 결과는 문자열 또는 목록일 수 있습니다. 문자열이 구분 기호로 구분된 경우.
목록 결과: {"a,1","b,2","c,3","d,4","e,5","f,6","g,7"};
문자열 결과: "a:1,b:2,c:3,d:4,e:5,f:6,g:7";
스크립팅Re: 여러 목록 항목을 함께 연결안녕하세요 @ts2 ,
결과로 수행하려는 작업에 따라 몇 가지 다른 방식으로 접근할 수 있습니다. 반복 함수를 원하지 않는다는 것을 알고 있지만 한 목록의 요소가 다른 목록의 요소에 연결된 올바른 출력을 얻으려면 For 루프를 수행해야 한다고 생각합니다. 연관 배열을 수행하는 것도 고려할 수 있습니다.
다음은 솔루션을 시작하는 데 도움이 될 수 있는 몇 가지 JSL입니다.
names default to here(1);
list1 = {"a","b","c","d","e","f","g"};
list2 = {"1","2","3","4","5","6","7"};
AA = Associative Array(List1, List2);
i=.;
result1={};
For(i=1, i<=nitems(list1), i++,
result1[i]=list1[i]||":"||list2[i]
);
result 2 = EvalList({Concat Items(result1, ", ")});
Show(result1);
Show(result2);
Show (AA);도움이 되었기를 바랍니다!,
DS
Re: 여러 목록 항목을 함께 연결JSL 루프는 부당하게 나쁜 평판을 가지고 있습니다. 루프의 내장이 많은 작업을 수행하는 경우 루프의 오버헤드는 일반적으로 그다지 중요하지 않습니다. 그리고 JSL 루프가 없는 솔루션은 어딘가에 루프를 포함할 것입니다. 아마도 C++에서 조금 더 빠르지만 여전히 그렇습니다. 어쨌든, 다음은 두 가지 방법을 비교한 것입니다. 하나는 JSL 루프를 포함하고 다른 하나는 JMP의 C++ 코드에 숨겨진 루프를 사용하는 것입니다.
약 39,000개 요소에서 두 알고리즘의 교차 시간을 보여주는 그래프.
dtGraph = New Table( "stats",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "table time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "loop time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
For( n = 1, n < 1e7, n *= 2,
dtGraph << addrows( 1 );
dtGraph:size[N Rows( dtGraph )] = n * 3;// 3 items repeated...
list1 = Repeat( {"a", "b", "c"}, n );
list2 = Repeat( {"1", "2", "3"}, n );
start = HP Time(); // data table method begins here
dt = New Table( "temp",
New Column( "a", Character, "Nominal", Set Values( list1 ) ),
New Column( "b", Character, "Nominal", Set Values( list2 ) ),
New Column( "c", Character, "Nominal", formula( a || ":" || b ) ),
invisible
);
dt << runformulas;
result = dt:c << getvalues;
Close( dt, nosave );
stop = HP Time(); // data table method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:table time[N Rows( dtGraph )] = (stop - start) / 1e6;
result = {};
start = HP Time(); // loop method begins here
While(
a = Remove From( list1, 1 );
b = Remove From( list2, 1 );
N Items( a ); // as long as something was removed...
, // do this...
Insert Into( result, a[1] || ":" || b[1] )
);
stop = HP Time(); // loop method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:loop time[N Rows( dtGraph )] = (stop - start) / 1e6;
Wait( 1 );
);
dtGraph << Graph Builder(
Size( 1200, 500 ),
Show Control Panel( 0 ),
Variables( X( :size ), Y( :table time ), Y( :loop time, Position( 1 ) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ), Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "size", ScaleBox, {Scale( "Log" ), Inc( 1 ), Minor Ticks( 1 )} ),
Dispatch( {}, "table time", ScaleBox, {Scale( "Log" ), Format( "Best", 12 ), Inc( 1 ), Minor Ticks( 1 )} )
)
);JMP 14는 내가 액세스할 수 있는 가장 오래된 것입니다. 루프 알고리즘은 JMP 12에서 비슷한 성능을 보일 것이라고 생각합니다. 이전 JMP 버전에는 목록에서 빠른 인덱싱이 없었지만 첫 번째 요소를 제거하는 것이 빠르기 때문에 두 목록을 처리할 때 의도적으로 두 목록을 파괴합니다. 데이터 테이블 알고리즘은 루프의 첫 번째이므로 목록이 삭제되기 전에 목록을 사용할 수 있습니다.
JSL을 되돌아보면 어느 알고리즘이 더 간단하거나 따르기 쉽다고 주장해서는 안 됩니다.
Re: 여러 목록 항목을 함께 연결예, iterative(for) 내의 iterative(for each row)가 스크립트 성능에 심각한 영향을 미칠 것이라고 가정했을 수 있지만 예제를 빌드한 후에 @DiedrichSchmidt 성능이 의외로 좋다고 합니다.
비교해주셔서 감사합니다. 저는 C++가 항상 더 빠를 것이라고 가정했지만 테이블에는 항상 더 많은 오버헤드가 있을 것입니다. "데이터 업데이트 시작" 및/또는 "비공개" 테이블이 테이블 오버헤드를 개선하는지 궁금합니다.
Re: 여러 목록 항목을 함께 연결감사합니다. 반복 함수를 사용하더라도 성능이 좋습니다.
Re: 여러 목록 항목을 함께 연결내 문제가 해결되었습니다. 이것은 귀하와 유용하다고 생각하는 다른 사람들을 위한 참고용입니다.
JMP14.3에 대한 액세스 권한이 있지만 조직 내 호환성을 위해 스크립트를 JMP12.2에서 실행해야 합니다.
나는 당신의 분석을 시도했고 JMP14.3에 대해 당신과 비슷한 결과를 얻었습니다. 아마도 컴퓨팅 성능에 약간의 차이가 있을 것입니다.

그러나 JMP12.2 루프의 성능은 완전히 벗어났습니다. 시간이 기하급수적으로 증가하고 24번째 행에 도달하지 않았기 때문에 98304 이후에 JMP.exe 프로세스를 종료해야 합니다.
