여러 열에 대한 실행 ID로 통계를 추가하는 JSL 루프는 오래되었습니다.안녕 얘들 아.
다음 사항에 대한 조언이 필요합니다.
이 루프에서는 이름이 "MEAS"(측정 용)로 시작하는 모든 Numeric 열을 찾고 runid 데이터로 그룹화 된 해당 열의 데이터를 기반으로 새로운 통계 열을 작성했습니다.
루프가 작동하지만 완료하려면 시간이 오래 걸립니다. 그 이유는 무엇입니까? 또는 그것을 개선하기 위해 무엇을 할 수 있습니까?
고마워
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
여러 열에 대한 실행 ID로 통계를 추가하는 JSL 루프귀하의 재생을 위해 Morgen thx.
시간 내 주셔서 감사 할 수 없었지만 시간이 걸리는 테이블 내에서 데이터를 요약하고 주 테이블의 해당 테이블에서 새 열을 업데이트하는 데 도움을 주셨습니다.
나는 당신이 제안한 스크립트와는 조금 다르게, 주로 요약 계산 (평균 (cols)) 내에서리스트 이름을 사용하는 것과 관련하여 문제가 발생했습니다.
어쨌든, 나는 나를 위해 완벽하게 작동하는이 짧은 스크립트를 생각해 냈습니다.
// 측정 값 통계를 추가합니다.
// 관련 열 이름 나열
meascol = dt << 열 이름을 가져옵니다 (숫자);
measnc = N 항목 (meascol);
meascollist = {};
For (i = 1, i <= measnc, i ++,
(Contains (meascol [i], "MEAS"),
삽입 (meascollist, meascol [i])
));
// 관련 칼럼 및 업데이트 테이블 요약
for (k = 1, k = n items (meascollist), k ++,
dt << 요약
그룹 (: RUNID),
Mean (char (meascollist [k])),
Max (char (meascollist [k])),
최소 (char (meascollist [k])),
출력 테이블 이름 ( "tempmeas")
);
dt << 업데이트 (
(데이터 테이블 ( "tempmeas"))를 사용하여,
열 일치 (: RUNID = : RUNID)
);
닫기 (데이터 테이블 ( "tempmeas"), 저장 안 함));
여러 열에 대한 실행 ID로 통계를 추가하는 JSL 루프귀하의 재생을 위해 Morgen thx.
시간 내 주셔서 감사 할 수 없었지만 시간이 걸리는 테이블 내에서 데이터를 요약하고 주 테이블의 해당 테이블에서 새 열을 업데이트하는 데 도움을 주셨습니다.
나는 당신이 제안한 스크립트와는 조금 다르게, 주로 요약 계산 (평균 (cols)) 내에서리스트 이름을 사용하는 것과 관련하여 문제가 발생했습니다.
어쨌든, 나는 나를 위해 완벽하게 작동하는이 짧은 스크립트를 생각해 냈습니다.
// 측정 값 통계를 추가합니다.
meas_ncol = n col (dt);
// 관련 열 이름 나열
meascol = dt << 열 이름을 가져옵니다 (숫자);
measnc = N 항목 (meascol);
meascollist = {};
For (i = 1, i <= measnc, i ++,
(Contains (meascol [i], "MEAS"),
삽입 (meascollist, meascol [i])
));
// 관련 칼럼 및 업데이트 테이블 요약
for (k = 1, k = n items (meascollist), k ++,
dt << 요약
그룹 (: RUNID),
Mean (char (meascollist [k])),
Max (char (meascollist [k])),
최소 (char (meascollist [k])),
출력 테이블 이름 ( "tempmeas")
);
dt << 업데이트 (
(데이터 테이블 ( "tempmeas"))를 사용하여,
열 일치 (: RUNID = : RUNID)
);
닫기 (데이터 테이블 ( "tempmeas"), 저장 안 함));
여러 열에 대한 실행 ID로 통계를 추가하는 JSL 루프테이블 값 계산 (순서) 및 렌더링 (그리기) 횟수 때문에 시간이 걸립니다. 또한 열 수식은 값을 사용하는 것보다 속도를 느리게 할 수 있습니다.
참고 : 사용하는 방법은 runid 행을 찾아서 (: runid), 각 열에 대해 3 번 찾아 계산하는 것입니다. 두 가지 대체 방법은 다음과 같습니다.
- 테이블 조작을 사용하고 열 수식을 잊어 버리십시오. 예제 스크립트는 JMP 샘플 데이터 테이블 인 Semiconductor Capability.jmp를 사용하여 아래에 있습니다.
- 시퀀스 열을 추가하고, 나는 seq를 row ()라고 부른다. Summarize (rid = By (: runid), ibeg = Min (: seq), iend = Max (: seq))를 사용하십시오. 그런 다음 테이블 할당을 사용하십시오. 나는 그것이 테이블 조작보다 느릴 것이라고 믿기 때문에이 방법의 예를 보여주지 않았다.
Names Default to Here(1);
dt = Open("$sample_data/semiconductor Capability.jmp");
//change lot_id column name to runid
dt:lot_id << set name("runid");
//select the columns here. I will just use columns with a name that starts with I
cols = {};
for(i=5, i<=ncol(dt), i++,
nme = column(dt,i) << get name;
if( substr(nme, 1, 1) == "I", insert into(cols, nme) );
);
sumdt = dt << Summary( Group(:runid), Mean(cols), Max(cols), Min(cols),
statistics column name format( "column stat" ), Invisible,
Link to original data table( 0 )
);
ord = {"runid"};
for(i=1, i<=ngrp, i++,
nme = cols[i];
column(sumdt, nme || "Mean") << Set Name(nme || "_MEAN");
column(sumdt, nme || "Min") << Set Name(nme || "_MIN");
column(sumdt, nme || "Max") << Set Name(nme || "_MAX");
insert into( ord, eval list({nme||"_MEAN", nme||"_MIN", nme||"_MAX"}))
);
newdt = sumdt << Subset( All Rows, Columns(ord), Invisible );
close(sumdt, NoSave);
wait(0);
dt2 = dt << Join(
With( newdt ),
By Matching Columns( :runid = :runid ),
Merge Same name columns(1),
Match Flag(0),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
close(newdt,NoSave);
nme = dt << get name;
Close(dt, NoSave);
dt = dt2;
dt << set name(nme);
dt << delete scripts("Source");좋은 JSL은 Order By (list), dt << Order Columns By (mylist) 또는 dt << Move Columns (list, After | | Last | To First)의 데이터 테이블 메시지입니다. 현재 Subset (Columns (list))이 가장 빠릅니다.