임시 값을 저장하는 csv 파일이 있습니다. 아래 단계에 따라 특정 샘플 세트에 대한 그룹 평균을 찾아야합니다.
1. 25보다 작은 모든 임시 값을 0으로 만듭니다.
2. group_avg 열은 연속 된 0보다 크거나 같은 행을 무시하여 파생됩니다. 다음과 같이 샘플 그룹의 평균을 계산합니다.
3. final_average 열은 group_avg 열에서 생성 된 결과입니다.
jsl을 사용하여이 프로세스를 어떻게 스크립팅 할 수 있습니까?
csv 파일 첨부
최종 결과는 최종입니다. _average (아래 표 참조) :

다음은 TEMP 열만으로 데이터 테이블을 만든 다음 나머지 열을 만들고 수식을 사용하여 채우는 스크립트입니다.
Names Default To Here( 1 );
dt = New Table( "temp_temp",
Add Rows( 54 ),
New Column( "TEMP",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[23.23019577, 23.44946668, 23.56111955, 23.47601143, 23.36428639,
23.24016499, 32.42091411, 23, 32.26821731, 32.14990084, 32.42091411,
32.26821731, 32.14990084, 23.23019577, 23.44946668, 23.56111955,
23.47601143, 23.36428639, 23.24016499, 32.15353181, 32.16785998, 21,
32.502366, 32.16261133, 32.15757688, 32.16790474, 23.23019577,
23.44946668, 23.56111955, 23.47601143, 23.36428639, 23.24016499,
32.42091411, 10, 32.26821731, 32.14990084, 32.41334166, 32.17456755,
32.52383338, 32.17310331, 19.28571429, 19.28571429, 19.28571429,
19.28571429, 34.62948075, 34.28766971, 34.29470736, 34.61532486,
34.386807, 34.36554216, 34.58410721, 34.28726312, 23.57142857,
23.57142857]
)
)
);
dt << New Column( "post process", formula( If( :TEMP <= 25, 0, :TEMP ) ) );
dt:post process << delete formula;
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
Show( "start", Row(), flag );
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
Show( "cap", Row(), captureMatrix );
If( zeroCounter == 4 | Row() == N Rows( dt ),
For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);
value = Mean( captureMatrix );
Show( value );
Show( Row(), captureMatrix, zeroCounter, Index( 1, N Cols( captureMatrix ) - (zeroCounter - 1) ) );
flag = 0;
zeroCounter = 0;
Show( flag );
captureMatrix = [];
);
);
value;
)
);
dt << new column("final Avg",
formula(
if(row()==1,
theRows = current data table() << get rows where(isMissing(:group_avg)==0);
);
If(row()<= nrows(theRows),
value=:group_avg[theRows[Row()]],
value=.
)
)
);
이 스크립트는 작은 파일에서 잘 작동합니다. 그러나 4 개의 JMP 대신 16000 개의 0이있는 대용량 파일의 경우 응답이 중지됩니다. 이를 방지하고 중단없이 스크립트를 실행할 수있는 방법이 있습니까?
문제는 실수로 코드에 여러 개의 "Show ()"문을 남겼 기 때문에 JMP 로그에 많은 내용을 기록해야한다는 것입니다.
아래는 "사후 프로세스"열 사양으로, JMP를 중단시키는 문제가 있다고 가정합니다.실행을 시도하고 매달리지 않고 실행되는지 확인하십시오.
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
If( zeroCounter == 4 | Row() == N Rows( dt ),
/*For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);*/
if( Row() == N Rows( dt ), zerocounter++ );
value = Mean( captureMatrix[ 1:: ncols(captureMatrix) - (zeroCounter - 1)] );
flag = 0;
zeroCounter = 0;
captureMatrix = [];
);
);
value;
)
);