我有一個存儲臨時值的 csv 檔案。 我必須根據以下步驟找到某些樣本集的組平均值:
1. 使所有小於 25 的臨時值等於 0 iecolumn post_process
2. group_avg 列是忽略具有大於或等於 4 個連續零的行而得出的。 接下來計算該組樣本的平均值,如下所示
3. Final_average欄位是group_avg欄位產生的結果
我們如何使用 jsl 編寫此過程的腳本?
附加 csv 文件
最終結果為最終結果_average如下表所示:

程式碼的第二個版本更有效率。 考慮到您正在運行的數據量,我認為這會有所幫助。它應該提供相同的結果。如果沒有,您可以嘗試從程式碼的第一個版本中刪除所有 Show() 語句,看看是否有效。
第一個腳本給了正確的答案,但是兩個腳本的輸出不同,為什麼你註解了程式碼的某些部分
我懷疑問題在於我錯誤地在程式碼中留下了幾個「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;
)
);該腳本適用於小文件。 但如果是大文件,其中有 16000 個零而不是 4 個 JMP 就會停止回應。 有什麼辦法可以防止這種情況並運行腳本而不會掛起嗎?
以下腳本僅使用 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=.
)
)
);