複数列の実行IDで統計を追加するJSLループには時間がかかるこんにちは、みんな。
次のことについてあなたのアドバイスが必要です。
このループで、名前が "MEAS"(測定用)で始まるすべてのNumeric列を探し、それらの列のデータをrunidデータでグループ化して新しい統計列を作成します。
ループは機能していますが、完了するまでに時間がかかります。それともそれを改善するために何ができるか?
THX
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
複数列の実行IDで統計を追加するJSLループには時間がかかるあなたのリプレイのためのMorgen THX。
時間通りにお礼を言うことはできませんでしたが、結局私は一時テーブル内のデータを要約してメインテーブルのそのテーブルから新しい列を更新するようにあなたのアドバイスを受けました。
私があなたが提案したスクリプトとは少し違ったやり方をしました。これは主に、要約計算内でリスト名を使用することに伴う問題(Mean(cols))のためです。
とにかく、私は私にとって完璧に働いているこの短いスクリプトを思い付きました:
//測定統計を追加
//関連する列名を一覧表示します
meascol = dt <<列名(数値)を取得します。
measnc = N項目(meascol)。
meascollist = {};
(i = 1、i <= measnc、i ++、
((meascol [i]、"MEAS")を含む場合、
に挿入(meascollist、meascol [i])
;);
//関連列の要約とテーブルの更新
(k = 1、k <= n項目(meascollist)、k ++の場合)
dt <<概要(
グループ(:RUNID)、
平均値(char(meascollist [k]))、
最大(char(meascollist [k]))、
Min(char(meascollist [k]))、
出力テーブル名( "tempmeas")
;
dt <<更新(
(データテーブル( "tempmeas"))を使って、
列の一致(:RUNID =:RUNID)
;
close(データテーブル( "tempmeas")、保存なし));
複数列の実行IDで統計を追加するJSLループには時間がかかるあなたのリプレイのためのMorgen THX。
時間通りにお礼を言うことはできませんでしたが、結局私は一時テーブル内のデータを要約してメインテーブルのそのテーブルから新しい列を更新するようにあなたのアドバイスを受けました。
私があなたが提案したスクリプトとは少し違ったやり方をしました。これは主に、要約計算内でリスト名を使用することに伴う問題(Mean(cols))のためです。
とにかく、私は私にとって完璧に働いているこの短いスクリプトを思い付きました:
//測定統計を追加
meas_ncol = n col(dt);
//関連する列名を一覧表示します
meascol = dt <<列名(数値)を取得します。
measnc = N項目(meascol)。
meascollist = {};
(i = 1、i <= measnc、i ++、
((meascol [i]、"MEAS")を含む場合、
に挿入(meascollist、meascol [i])
;);
//関連列の要約とテーブルの更新
(k = 1、k <= n項目(meascollist)、k ++の場合)
dt <<概要(
グループ(:RUNID)、
平均値(char(meascollist [k]))、
最大(char(meascollist [k]))、
Min(char(meascollist [k]))、
出力テーブル名( "tempmeas")
;
dt <<更新(
(データテーブル( "tempmeas"))を使って、
列の一致(:RUNID =:RUNID)
;
close(データテーブル( "tempmeas")、保存なし));
複数列の実行IDで統計を追加するJSLループには時間がかかるテーブル値の計算(順序)とレンダリング(描画)の数が多いため、これには時間がかかります。 また、列式は値を使用するよりも遅くなることがあります。
使用している方法は、(:runid)によって、各列に対して3回、runid行を見つけて計算することに注意してください。 2つの代替方法があります。
- テーブル操作を使用して列式を忘れます。JMPサンプルデータテーブルSemiconductor Capability.jmpを使用したスクリプトの例を以下に示します。
- シーケンス列を追加し、それをrow()というseqと呼びます。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(list)、dt << Order Columns By(mylist)、またはdt << Move Columns(list、After | Before | Before | To Last | To First)へのデータテーブルメッセージです。 現在、Subset(Columns(list))が最速です。