데이터 테이블을 반복하거나, Recode를 사용하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?최근 커뮤니티 토론 전체 테이블에서 숫자 값을 찾아 누락된 값으로 바꾸는 스크립트 에서 제공한 아주 좋은 항목이 있었습니다. @SDF1 솔루션으로 선택한 것
names default to here(1);
dt=current data table();
For( i = 1, i <= N Rows( dt ), i++,
For( l = 1, l <= N Cols( dt ), l++,
If( Column( l )[i] == 999,
Column( l )[i] = .
)
)
);
솔루션을 보았을 때 대략적으로 다음과 같은 오래된 가르침이 내 머리 속에 떠올랐습니다. "데이터 테이블을 반복하지 마십시오.루핑이 느립니다. JMP 내장 기능을 사용하세요."
그래서 수정을 시작했어요 @SDF1 암호.
나는 "Get Rows Where()"라는 대체 표준이 더 빠르다고 판단했습니다.결국, "매우 빠른" Get Rows Where()가 행을 찾은 후에 발견된 모든 행을 하나의 지정문으로 설정할 수 있습니다.
내가 본 또 다른 해결책 밀린 커뮤니티에서 권장하는 것은 JMP의 Recode 기능입니다.
그래서:
가설: Get Rows Where 및 Recode의 내장된 JMP 기능은 전체 데이터 테이블을 반복하는 것보다 더 빠릅니다.
저는 반도체 성능 데이터 테이블을 132열 1455행의 적당한 크기의 테이블로 선택했습니다.
각 열의 임의 값 10개를 999로 설정하는 작은 스크립트를 작성했습니다.
names default to here(1);
dt=current data table();
for(i=5,i<=ncols(dt),i++,
if(col stddev(ascolumn(dt,i))!=0,
for(k=1,k<=10,k++,
column(dt,i)[randominteger(1,1455)]=999;
)
));
Names Default To Here( 1 );
dt = Current Data Table();
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
dt << Recode Column(
As Column( dt, i ),
{If( _rcNow == 999, ., _rcNow )},
Target Column( As Column( dt, i ) )
)
);
show(hptime()-start)
이는 위에서 언급한 토론에서 변경될 원래 값입니다.999는 스크립트에 의해 누락된(.)으로 변경됩니다.
방법:
- JMP 16을 시작합니다.
- 반도체 성능 데이터 표 읽기
- 스크립트를 실행하여 각 열에 999개의 값을 설정하세요.
- 3가지 방법 각각에 대해 위의 2단계를 반복하고 시간을 밀리초 단위로 기록합니다.
- JMP15에 대해 위 단계를 반복합니다.
다음은 Recode 스크립트입니다.
Names Default To Here( 1 );
dt = Current Data Table();
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
dt << Recode Column(
As Column( dt, i ),
{If( _rcNow == 999, ., _rcNow )},
Target Column( As Column( dt, i ) )
)
);
show(hptime()-start)
Get Rows Where 코드
names default to here(1);
dt=current data table();
start=hptime();
for(i=5,i<= ncols(dt),i++,
column(dt,i)[dt<<GET rows="" where=""></GET>
그리고 여기 놀라운 결과가 있습니다

For 루프가 승리합니다.그리고 그 결과에서 Get Rows Where는 자제해서 사용해야 합니다.
댓글과 수정 환영합니다......
데이터 혼합 및 정리품질 및 프로세스 엔지니어링Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?
@jthi 썼다:
이것에 대해 너무 깊게 설명했을 수도 있습니다(하지만 나중에 필요한 경우 이러한 유형의 테스트를 수행하는 방법에 대한 아이디어를 얻었습니다).
나는 999를 누락된 것으로 바꾸는 다양한 방법을 테스트하기 위해 다양한 표현식을 사용하여 일종의 테스트 스크립트를 작성했습니다.
....
방금 사용했어요 @jthi 님의 스크립트:
https://community.jmp.com/t5/Discussions/Should-you-Loop-through-a-data-table-or-use-Recode-or-use-Get/mp/381766/highlight/true#M63232
Jmp(16.2 & ) 17.1을 사용하여 시스템에서 다양한 접근 방식의 성능을 재현합니다.
나는 몇 가지 접근 방식을 강조했습니다(포함). 위치 ) 요즘은 안에 있어야 해요 데이터 업데이트 시작/종료 *)
999의 비율이 증가함에 따라 심각한 시간 증가를 제거합니다.
요소 2의 차이는 컴퓨터마다 다를 수 있습니다.
직접 비교를 위해 Jmp 15 및 17 시스템을 보유한 사람은 누구입니까?
*) 하위 집합이 "보이지 않게" 열렸지만.

Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?@호기 썼다:
...
사용자가 문제를 알고 있는 경우, 아주 값이 싼 해결책은 평가()
값이 싼 JSL 코드의 복잡성과 시간 패널티에 관한 것입니다.
그러나 더 긴 테이블의 경우 평가(i) 또 크게 졌다 대체(... ,NameExpr(열()))) .
그래서: 원래 버전에 비해 여전히 꽤 빠르지만, 예상했던 것만큼 빠르지는 않습니다.
왜? 근본적인 차이점은 무엇입니까?
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?흠, 아마도 JSL을 사용자 친화적인 모드(더 나은 성능으로 이어질 경우 변수를 사전 평가하는 모드)로 전환하는 것이 가능할까요?
소망: 행 가져오기: 속도 문제
사용자가 문제를 알고 있는 경우 매우 값이 싼 해결책은 평가():
start = HP Time();<BR />for(i=5,i<= ncols(dt),i++,<BR />dt << get rows where( As Column( dt, Eval(i) ) == 999 );<BR />);<BR />Show( (HP Time() - start) / 1000000 );start = HP Time();
i = 5;
dt << get rows where( As Column( dt, Eval(i) ) == 999 );
Show( (HP Time() - start) / 1000000 );
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?안녕 @ron_horne , 문제는 어디에서 행을 가져오나요? , 따라서 속도는 이러한 설정과 무관해야 합니다.
반면에 열 인덱스가 명시적인지 또는 변수인지(변수에 할당된 값이 있더라도) 경우에는 큰 차이가 있습니다.
이것은 나에게 명확하지 않았습니다. 이 대화를 찾은 것이 얼마나 좋았습니까!
~N(데이터 테이블의 행) 배만큼 더 빠를 수 있는 jsl 코드가 얼마나 되는지 모르겠습니다.
JSL의 백그라운드에서 진행되는 작업으로 문제를 해결할 수 있습니까?
아니면 그러한 동작이 의도되었으며 변경할 수 없음을 지정하는 JSL 아키텍처에 근본적인 무언가가 있습니까?
그렇다면: 경고 메시지는 코더가 이 문제에 갇히지 않도록 도움을 줄 수 있습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
For( k = 1, k <= 4, k++,
dt << Concatenate( dt, dt, dt, Append to first table )
);
nuke = Function( {},
For( k = 1, k <= 10, k++,
Column( dt, 5 )[Random Integer( 1, 1455 )] = 999
)
);
//dt << show window(0);
//dt<< Begin Data Update();
nuke();
start = HP Time();
i = 5;
dt << get rows where( As Column( dt, i ) == 999 );
Show( (HP Time() - start) / 1000000 );
nuke();
start = HP Time();
dt << get rows where( As Column( dt, 5 ) == 999 );
Show( (HP Time() - start) / 1000000 );
//dt << End Data Update();
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?감사합니다 @txnelson
다양한 방법에서 보이지 않는 테이블과 개인 테이블을 사용할 때의 효과를 추정해 주실 수 있나요? 성능 향상을 위해 스크립트를 수정하는 가장 빠른 방법이어야 합니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?와, 정말 멋진 트릭이네요 
나는 그 문제가 누락된 값 코드 시도하자마자 시작됩니다.
Col Maximum(:NPN3)
[우리가 알고 있듯이 제외된 행은 다음과 같아야합니다 제외된 Col 집계에서 수동으로(또는 더 나은 방법: 그룹화 기준 논쟁).]
하지만 놀라운 점은 다음과 같습니다. 안부 집계 존중 누락된 값 코드 
까다롭게 굴다: OP 질문 원래 게시물의 내용은 매우 암시적이었습니다.
그리고 그 결과에서, 행 가져오기 아껴서 사용해야 합니다.
댓글과 수정 환영합니다......
- 내 뱃속에 불안한 느낌을 가지고 - 다음과 같이 번역되었습니다: "도대체 왜?!?"
덕분에 @ErraticAttack 퍼즐을 풀기 위해 
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 할까요?지금까지 정말 재미있고 유익한 토론이었습니다! 훌륭한 답변. 나는 여기에 가치 있는 어떤 것도 추가할 자격이 없으므로 "속임수"에 의지하겠습니다.
OP 질문은 999가 값 코드가 누락되어 계산에 포함되는 것을 원하지 않기 때문에 데이터의 999 값을 누락된 값으로 바꾸는 것이었습니다. 이것은 매우 흥미로운 질문 라인의 정신에 전혀 부합하지 않지만, 제가 기여한 점은 누락된 값 코드 열 속성을 활용하는 것이 데이터를 대체하는 것보다 빠르며 *대부분의* 목적에 대해 동일한 결과를 얻을 수 있다는 것입니다. 
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
Column(dt,i) << Set Property( "Missing Value Codes", {999} )
);
Show( HP Time() - start);
내 m1 Mac에서는 ~ 0.007초입니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?아, 몰랐어요:
:이름() 다음과 같이 행동한다 열로() ?
스크립팅 인덱스에서는 명확하지 않습니다. 
그래서, 대리자 그리고 열로() 대신에 Eval(Parse(Eval Insert(JSL Quote(name("^이름[i]^") 그것은:
start=hptime();
for(i=5,i<= ncols(dt),i++,
Eval(Substitute(Expr(column(dt,i)[dt<<GET rows="" where=""></GET>
그리고 그 후에 이 놀라운 발견 나는 여기서 거의 놀랐다. 어디에서 행을 가져오나요? 숫자 비교가 문자 비교로 대체되면 속도도 빠릅니다. 
start=hptime();
for(i=5,i<= ncols(dt),i++,
Eval(Substitute(Expr(column(dt,i)[dt<<GET rows="" where=""></GET>
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?네 이해했습니다 @brady_brady . 그러나 다음과 같이 할 수 있습니다.
NamesDefaultToHere(1);
// Make an example table with some rogue '999' values
nr = 10; // Number of rows
nc = 10; // Number of columns
p = 0.1; // Fraction of rogue values
val = 999; // Rogue value
m = J(nr, nc, RandomInteger(1, 10));
m = Shape(m, nr*nc, 1);
m[RandomIndex(nr*nc, Floor(nr*nc*p))] = val;
m = Shape(m, nr, nc);
dt = AsTable(m);
dt << setName("Rogue Values");
Wait(3);
// Set rogue values to '.'
mask = J(nr*nc, 1, 1);
mask[Loc(dt[0,0] == val)] = .;
mask = Shape(mask, nr, nc);
dt[0,0] = mask :*</img> dt[0,0];
그러나 나는 이것이 요소별 곱셈 때문에 이미 가지고 있는 것보다 더 빠를 것이라고 매우 의심합니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?여기서 비교가 약간 잘못되었습니다. "Get Rows Where" 기능은 각 행의 표현식을 평가하므로 루프를 실행하기 전에 불필요한 조회를 최소화해야 합니다. 특히 반복자가 외부에 있고 각 행에서 그것을 찾으려면 약간의 범위 탐색을 수행해야 합니다.또한 각 행에서 AsColumn 함수를 평가하여 매번 'dt'와 'i'를 모두 찾습니다.이건 _매우_ 비싸요.이에 대한 올바른 방법은 다음과 같습니다.
names default to here(1);
dt=current data table();
start=hptime();
names = dt << Get Column Names( "string" );
for(i=5,i<= ncols(dt),i++,
Eval( Parse( Eval InserT( JSL Quote(
column(dt,i)[dt<<GET rows="" where=""></GET>
이것이 3000배 정도 더 빠르게 실행된다는 것을 알 수 있을 것입니다. 이는 여러분이 가지고 있는 다른 방법보다 낫지는 않더라도 비교할 수 있을 것입니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?예... 문제는 단일 인덱스(행 주요 레이아웃으로 가정)를 사용하여 행렬에 액세스할 수 있지만 데이터 테이블은 액세스할 수 없다는 것입니다. 따라서 슬프게도 이와 유사한 것은 없습니다.
m[loc(m, 9999)] = .
여기서 m은 데이터 테이블 세계에서 pxq 행렬입니다. 따라서 위 코드에서 이 행의 앞뒤에 있는 행이 있습니다. 코드는 여전히 빠르지만, 테이블에 단일 인덱스 액세스를 사용할 수 있다면 정말 빠를 것입니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?'에 대한 행렬을 생성하는 데 드는 오버헤드'라고 생각합니다. 데이터 테이블 구독 도움이 될 수도 있습니다.@Craige_Hales 알 것이다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?행렬을 생성하고 그 후에 테이블에 다시 할당하는 데 오버헤드가 있지만 루프를 방지하는 방법은 다음과 같습니다. 이 접근 방식은 이 데이터에서 loc_2d와 거의 동일하게 빠르게 수행되지만 테이블이 거대해지면 상대적인 성능이 저하될 것으로 예상하지만 이를 확인하지는 않았습니다.
expr_mat = expr(
m = dt[0, 5 :: N Col( dt )];
m[Loc( m, 999 )] = .;
dt[0, 5 :: N Col( dt )] = m;
);
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?이것에 대해 너무 깊게 설명했을 수도 있습니다(하지만 나중에 필요한 경우 이러한 유형의 테스트를 수행하는 방법에 대한 아이디어를 얻었습니다).
나는 999를 누락된 것으로 바꾸는 다양한 방법을 테스트하기 위해 다양한 표현식을 사용하여 일종의 테스트 스크립트를 작성했습니다. 두 개의 데이터 세트(Semiconductor Capability.jmp 및 Probe.jmp)를 사용하여 열에서 누락된 값의 양을 변경하면서 테스트했습니다.
Loc()은 값을 바꾸는 데 가장 빠릅니다(놀랍지 않습니다). Missing Value Codes()는 "항상" 빠르지만 Loc()에 비해 사용 사례가 조금 더 제한되어 있으며 교체할 값이 여러 개 있는 경우 사용하기가 조금 더 번거롭습니다.

가장 빠른 것은 loc_2d였습니다(이것에서 변수 이름을 변경하는 것을 귀찮게 하지 않았습니다: 2D 매트릭스와 함께 Loc 사용 ). (적어도 내가 아는 한) 값을 설정하려면 계속 반복해야 하므로 이것이 Loc()보다 빠른 이유는 일부 열을 건너뛰기 때문일 가능성이 높습니다. 다음은 expr_loc2d 및 expr_loc입니다.
expr_loc = Expr(
for(i=5,i<= ncols(testData),i++,
column(testData,i)[Loc(testData[0,i], 999)]=.;
);
);
expr_loc_2d = Expr(
mat = testData[0,5::NCols(testData)];
nr = N Rows(mat);
nc = N Cols(mat);
blacklocs = Loc(mat, 999) - 1;
rowlocs = Floor((blacklocs) / nc ) + 1;
collocs = Mod((blacklocs), nc ) + 1 + 4;
uniqCols = Associative Array(collocs) << get keys;
For(i_2d = 1, i_2d <= N Items(uniqCols), i_2d++,
testData[rowlocs[Loc(collocs, uniqCols[i_2d])], uniqCols[i_2d]] = .;
);
);
또한 AsColumn(Column(dt, i)) 을 사용하는 것이 중요한 것 같습니다. @Ryan_Gilmore (매우 느릴 것이기 때문에 << 행 가져오기 없이는 테스트하지 않았습니다.) Column()을 사용하거나 사용하지 않고 테스트 기록을 수행했습니다. 또한 녹음에서 하나의 Column()이 누락된 것을 확인했으므로 몇 가지 빠른 테스트를 실행하십시오(데이터나 스크립트에 첨부되지 않음).
이 세 가지 사이에는 상당히 큰 차이가 있습니다.
expr_recode_ascolumn = Expr(
For(i = 5, i <= N Cols(testData), i++,
testData << Recode Column(
As Column(dt, i),
{If( _rcNow == 999, ., _rcNow)},
Target Column(As Column(testData, i))
)
);
);
expr_recode_ascolumn_column = Expr(
For(i = 5, i <= N Cols(testData), i++,
testData << Recode Column(
As Column(dt, i),
{If( _rcNow == 999, ., _rcNow)},
Target Column(As Column(Column(testData, i)))
)
);
);<BR />
expr_recode_ascolumn_column_column = Expr(
For(i = 5, i <= N Cols(testData), i++,
testData << Recode Column(
As Column(Column(dt, i)),
{If( _rcNow == 999, ., _rcNow)},
Target Column(As Column(Column(testData, i)))
)
);
);

테스트 스크립트와 일부 결과 데이터가 첨부되어 있습니다. 스크립트에는 여기저기서 실수가 있을 가능성이 높습니다. 누군가가 원할 경우 새로운 표현을 추가하는 것은 상당히 쉬울 것입니다. 제가 전혀 테스트하지 않은 한 가지는 << 데이터 업데이트 시작/종료를 사용하는 것입니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?흥미로운 토론! JMP 13에서 처음 등장한 데이터 테이블 행렬 표기법은 할당에 매우 효율적입니다.
이 특정 문제의 경우 for 루프보다 거의 500배 빠릅니다(0,003 대 1.5초, JMP 15 Mac 노트북).
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
Try( dt[Loc( dt[0, i], 999 ), i] = . )
);
Show( HP Time() - start);
"999"가 없는 열에 대한 오류를 방지하려면 try()가 필요합니다.
전체 행렬에 대한 직접 할당이 더 빠를 것이라고 생각했지만 작동하지 않기 때문에 열에 대한 반복은 여전히 필요합니다. 오류: "여러 첨자는 액세스 또는 평가의 각 내부 수준에서 단일 첨자가 필요합니다...", 다시 생각해 보면 이 말이 이해가 됩니다.
// The left Data Table matrix syntax is OK on its own, but not for assignment.
dt[0, 5 :: N Col( dt )][Loc( dt[0, 5 :: N Col( dt )], 999 )] = .;
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?어느 시점에서는 루프를 사용하는 것에 대해 조심스러웠을 수도 있지만 한 알고리즘 과정을 수강한 후에는(결코 끝내지 못했습니다..) 그 정도가 조금 덜해졌습니다. 당신은 그것들을 효율적으로 다루어야 하며, 종종 너무 많은 루프를 반복하게 됩니다(시간 복잡성 및 Big O 표기법). 또한 루프를 사용하는 것은 순수 수학으로 문제를 해결하는 것보다 훨씬 쉽습니다.
JMP에서는 속도가 거의 문제가 되지 않기 때문에 보통 어느 시점에서 배운 안전한 옵션을 사용합니다. 하지만 시간이 문제가 되는 경우(직장에서 하나의 응용 프로그램을 여는 데 6분 이상 소요) 더 빠르게 만들 수 있는 방법을 찾기 시작할 것입니다(2분 이내에 시작하도록 관리됨). 이 경우 다른 기능(행 삭제, 행 상태 설정)의 다양한 조합과 함께 Loc()을 사용하여 속도를 더 빠르게 만들 수 있었습니다.
Loc() 외에도 Summarize()를 사용하는 것이 열에서 고유한 값을 가져오는(연관 배열() << 키 가져오기) 오랫동안 즐겨 사용하는 옵션과 비교할 때 "훨씬" 더 빠른 것 같습니다. 행 수가 증가하면 연관 배열() << 가져오기 키가 점점 느려지고 Summarize()는 적어도 빠르지는 않지만 동일한 문제로 고통받지 않는 것 같습니다. 그래서 나는 Summarize()를 더 많이 사용하려고 시도했습니다(데이터 테이블의 높이가 얼마나 되는지는 전혀 알 수 없음).
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?그래서 우리는 AsColumn()을 건너뜁니다(예감으로 더 나아가서 이것이 모든 올바른 값을 대체할지 테스트하지 않았습니다).
start=hptime();
for(i=5,i<= ncols(dt),i++,
column(dt,i)[Loc(dt[0,i], 999)]=.;
if(mod(i,10)==0,show(i));
);
show(hptime()-start);
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?나는 Loc()이 가장 좋은 방법이라는 데 동의합니다.
저에게는 As Column 때문에 속도 저하가 발생하는 것 같습니다. 제가 보기엔 상당한 차이가 있는데,
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
As Column( column(dt, i) );
);
Show( HP Time() - start );
그리고
start = HP Time();
For( i = 5, i <= N Cols( dt ), i++,
As Column( dt, i );
);
Show( HP Time() - start );
코드에서 As Column 구문 변경 @txnelson 원래 질문에 따르면 For 루프는 여전히 가장 빠르지만 다른 루프는 더 비슷합니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?안녕 @txnelson ,
매우 흥미로운 비교이며, 기대했던 결과도 아닙니다. 나는 대학에서 처음 프로그래밍을 배우기 시작했을 때 비슷한 것을 배웠던 것을 기억합니다. 루프는 느리기 때문에 조심하십시오.
물론 일부 계산과 일부 프로그램에서는 For 루프가 다른 루프보다 매우 느리다는 것을 발견했습니다. 하지만 저는 그다지 뛰어난 프로그래머는 아니기 때문에 제가 아는 일에 의지하는 경향이 있는데, 이는 항상 빠르고 우아하지는 않습니다. 때로는 루프의 논리를 통해 내가 원하는 작업을 수행하는 기능 코드를 작성할 수 있으며 이를 통해 다음 단계로 넘어갈 수 있습니다.
JMP 16과 JMP 15의 경우 For Loop 및 Recode 옵션이 약간 더 느리다는 점이 흥미롭지만, Get Rows Where는 시간을 거의 절반으로 단축하여 개선되었으며 이는 상당한 변화입니다.
감사해요!,
DS
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?아마도 @Craige_Hales 더 빠른 솔루션을 제공할 수 있습니다. 나는 그의 커뮤니티 게시물/블로그에서 행렬 계산(특히 Loc())을 사용하는 아이디어를 얻었습니다.
데이터 세트를 연 다음 (사용자 선택에 따라) 오래된 데이터를 삭제하는 하나의 도구를 직장에서 더 빠르게 만들었습니다. 원래는 << 위치 선택 및 행 삭제를 사용했습니다. 나는 그것을 Loc() 마법으로 대체했고 훨씬 더 빨라졌습니다. 나는 요즘 Loc()을 정말 좋아합니다.
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?@jthi ,
귀하의 매트릭스 기반 코드가 가장 빠른 것으로 나타났습니다.
0.299795초.......
Re: 데이터 테이블을 반복해야 하거나, Recode를 사용해야 하거나, Get Rows Where를 사용하여 데이터 테이블의 값을 변경해야 합니까?나는 직장에서 우리가 가지고 있는 일부 오래된 스크립트에 대해 일부 최적화를 수행해 왔습니다. 제가 변경해야 했던 것 중 일부는 행을 어디에 가져오는 것과 관련이 있었습니다. 빠른 JSL 코드가 필요한 경우 점점 더 많은 행렬 연산(주로 Loc())을 사용하기 시작했습니다.
예를 들어 가져오기 행을 다음 위치로 변경할 수 있습니다(올바른 값 또는 모든 값을 바꾸는지 테스트하지 않음).
start=hptime();
for(i=5,i<= ncols(dt),i++,
column(dt,i)[Loc(ascolumn(dt,i) << get as matrix, 999)]=.;
if(mod(i,10)==0,show(i));
);
show(hptime()-start);
경우에 따라 작동할 수 있는 열 속성 값 레이블 및 누락된 값 코드를 사용하는 옵션도 있습니다. 가능하면 데이터를 변경하지 않기 때문에 사용하는 것을 좋아합니다.