通過多列的運行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(列(列表))最快。