一時的な値を保存するcsvファイルがあります。 以下の手順に従って、特定のサンプルセットのグループ平均を見つける必要があります。
1.25未満のすべての一時値をゼロに等しくしますiecolumnpost_process
2. group_avg列は、4つ以上の連続するゼロを持つ行を無視することによって導出されます。 次に、以下に示すように、サンプルのグループの平均を計算します。
3. final_average列は、group_avg列から生成された結果です。
jslを使用してこのプロセスをスクリプト化するにはどうすればよいですか?
csvファイルの添付
最終結果は最終です_以下の表のように平均:

これは、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のゼロがある大きなファイルの場合、応答が停止します。 これを防ぎ、ハングせずにスクリプトを実行する方法はありますか?
問題は、誤ってコードにいくつかの「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;
)
);