通过多列的运行ID添加统计信息的JSL循环需要很长时间嗨,大家好。
需要您的建议如下。
我关心这个循环,查找名称以“MEAS”开头的所有数字列(用于测量),并根据runid数据分组的列中的数据创建新的统计列。
循环工作但是需要很长时间才能完成 - 任何想法为什么?或者可以采取哪些措施来改善它?
谢谢
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
Re:通过运行ID为多列添加统计信息的JSL循环需要很长时间Morgen thx为您的重播。
无法及时感谢你,但最近我接受了你的建议,在temporrary表中汇总数据,并在主表中更新该表中的新列。
我做的与你建议的脚本略有不同,主要是因为我在汇总计算中使用了一个列表名称(Mean(cols))。
无论如何,我想出了这个适合我的短剧本:
//添加测量统计
//列出相关的列名
meascol = dt <<获取列名(数字);
measnc = N项(meascol);
meascollist = {};
对于(i = 1,i <= measnc,i ++,
如果(包含(meascol [i],“MEAS”),
插入(meascollist,meascol [i])
));
//摘要相关列和更新表
for(k = 1,k <= n项(meascollist),k ++,
dt <<摘要(
集团(:RUNID),
平均值(char(meascollist [k])),
Max(char(meascollist [k])),
Min(char(meascollist [k])),
输出表名称(“tempmeas”)
);
dt <<更新(
使用(数据表(“tempmeas”)),
匹配列(:RUNID =:RUNID)
);
关闭(数据表(“tempmeas”),没有保存));
Re:通过运行ID为多列添加统计信息的JSL循环需要很长时间Morgen thx为您的重播。
无法及时感谢你,但最近我接受了你的建议,在temporrary表中汇总数据,并在主表中更新该表中的新列。
我做的与你建议的脚本略有不同,主要是因为我在汇总计算中使用了一个列表名称(Mean(cols))。
无论如何,我想出了这个适合我的短剧本:
//添加测量统计
meas_ncol = n col(dt);
//列出相关的列名
meascol = dt <<获取列名(数字);
measnc = N项(meascol);
meascollist = {};
对于(i = 1,i <= measnc,i ++,
如果(包含(meascol [i],“MEAS”),
插入(meascollist,meascol [i])
));
//摘要相关列和更新表
for(k = 1,k <= n项(meascollist),k ++,
dt <<摘要(
集团(:RUNID),
平均值(char(meascollist [k])),
Max(char(meascollist [k])),
Min(char(meascollist [k])),
输出表名称(“tempmeas”)
);
dt <<更新(
使用(数据表(“tempmeas”)),
匹配列(:RUNID =:RUNID)
);
关闭(数据表(“tempmeas”),没有保存));
Re:通过运行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(列表),dt << Order Columns By(mylist)或dt << Move Columns(list,After | Before | To Last | To First)。 目前,我发现Subset(列(列表))最快。