我有一个存储临时值的csv文件。 我必须根据以下步骤找到某些样本集的组平均值:
1.使所有小于25的温度值等于零,即post_process
2. group_avg列是通过忽略大于或等于4个连续零的行而得出的。 接下来计算样本组的平均值,如下所示
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=.
)
)
);
该脚本适用于小型文件。 但是,在大型文件中,我们有16000个零而不是4个JMP会停止响应。 有什么办法可以防止这种情况并且在不挂起的情况下运行脚本?
我怀疑问题是由于错误,我在代码中留下了几个“ 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;
)
);第一个脚本给出了正确的答案,但是两个脚本的输出都不相同,为什么还要注释部分代码
该代码的第二个版本效率更高。 考虑到您正在运行的数据量,我认为这会有所帮助。它应该提供相同的结果。如果没有,您可以尝试从代码的第一个版本中删除所有Show()语句,如果可行。