一致する列の差と平均を生成する JSLこんにちは、
次の点について何らかの助けが得られることを期待しています。
次の表を含む JMP ファイルを添付します。

私の典型的な/開始時のデータセットには次のものが含まれます。
1. 識別子「タイプ」
2. 同じプレフィックスとさまざまな番号のサフィックスを持つ未知の数の列のセット。例: 番号 1、番号 2、番号 3...
3. 上記の #2 と同じ数の列の 2 番目のセット。#2 と同じプレフィックスと一致するサフィックスを持ちます (例: B num1、B num2、B num3...)。
セット A とセット B の列をペアにして計算するための列を生成するための JSL スクリプトを作成する方法を教えてください。
式( (:B 1.0 - :B 0.5) / (:A 1.0 - :A 0.5) ) )、
式( (:B 1.3 - :B 0.5) / (:A 1.3 - :A 0.5) ) )、
式( (:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) )、
次に、作成されたすべての列の平均を取る平均列 (「B/A Avg」) を生成します。 上記の生成列には任意の数を指定できることに注意してください。 それは3つかもしれないし、2つかもしれないし、あるいは6つかもしれない...
結局のところ、私が最も関心があるのは「B/A Avg」の最後の列を取得することです。スクリプトを簡素化する場合、中間列はオプションです。
私の質問で何か明確になることがあればお知らせください。 よろしくお願いします。
自動化とスクリプト作成基本的なデータ分析とモデリングRe: 一致する列の差分と平均を生成する JSL計算に使用される列のペアは何によって決まりますか?
Re: 一致する列の差分と平均を生成する JSL同じサフィックス(番号)を持ちます。 たとえば、0.5 から 0.5、1.0 から 1.0、1.3 から 1.3 など...
Re: 一致する列の差分と平均を生成する JSL列 A0.5、A1.0、A1.3、B0.5、B1.0、B1.3 がある場合、正確に (B1.0-B0.5)/(A1.0-) が必要であることをどうやって知ることができますか? A0.5)、(B1.3-B0.5)/(A1.3-A0.5)、および (B1.3-B1.0)/(A1.3-A1.0) 列?
Re: 一致する列の差分と平均を生成する JSL辛抱強く協力していただいたことに感謝するとともに、意図を 100% 明確に理解できなかったことをお詫びします。
方程式の場合、常に次のようになります: ( B num1 - B num2 ) / ( A num1 - A num2 )
A グループと B グループの間で常に同じサフィックスのセットを取得するため、私の目標は、A グループ間で可能なすべての組み合わせを取得することです。これは、より高い値のサフィックスとより低い値のサフィックスのみに制限できます。
あるいは、スクリプトを簡素化する場合は、任意のペア間の違いを見つけることもできます。たとえば、両方を含めるなどです。 (B1.0-B0.5)/(A1.0-A0.5) および (B0.5-B1.0)/(A0.5-A1.0)。 このようにすると、平均は高低のみと同じになります。
Re: 一致する列の差分と平均を生成する JSLこれが、必要な新しい列を作成する私の方法です。
names default to here(1);
dt=current data table();
// Set Prefixes
pre1 = "A";
pre2 = "B";
// Get all levels using Pre1 columns to find the levels
theColumnNames = dt << get column names( string, continuous );
levels = {};
For Each( {col, i}, theColumnNames,
if(word(1,col," ")==pre1,
insert into(levels,trim(substr(col,length(pre1)+1)))
)
);
// Create new columns.
// This is accomplished by creating a character string that is the JSL statement that
// is required to create the new column and it's formula
meanColsList = {};
For( i = 2, i <= N Items( levels ), i++,
For( k = 1, k <= i - 1, k++,
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] ||
"\!", formula( (:" || pre2 || " " || levels[i] || " - :" || pre2 || " " || levels[k] || ")
/ (:" || pre1 || " " || levels[i] || " - :" || pre1 || " " || levels[k] || ") ) );"
)
);
insert into( meanColsList, ":\!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] || "\!"n");
);
);
Eval(
Parse(
"dt << New Column( \!"" || pre2 || "/" || pre1 || " Avg\!", formula( Sum(" ||
Concat Items( meanColsList, "," ) || ") / Number(" ||
Concat Items( meanColsList, "," ) || ")));"
)
);Re: 一致する列の差分と平均を生成する JSLこれによっていくつかのアイデアが得られることもあります
Names Default To Here(1);
dt = Open("$DOWNLOADS/Question - Auto Col Diff and Avg.jmp");
dt << Clear Column Selection << Clear Select;
col_list = dt << Get Column Names("String");
// Get column types
col_rgx_pattern = "^(.?) (\d+.\d+)";
aa = Associative Array();
For Each({col_name}, col_list,
rgx_result = Regex(col_name, col_rgx_pattern);
If(!IsMissing(rgx_result),
parts = Words(rgx_result);
If(N Items(parts) == 2,
If(!Contains(aa, parts[1]),
aa[parts[1]] = {};
);
Insert Into(aa[parts[1]], parts[2]);
);
);
);
// Check that all different columns have same number parts (ignored in this case)
// Create combinations
ordered_num_parts = Reverse(Sort List(aa[aa << first])); // sort from largest to smallest, works in this simple case
pairs = {};
For(i = 1, i <= N Items(ordered_num_parts) - 1, i++,
For(j = i + 1, j <= N Items(ordered_num_parts), j++,
cur_pair = Eval List({ordered_num_parts[i], ordered_num_parts[j]});
Insert Into(pairs, Eval List({cur_pair}));
);
);
// Create new columns
avg_expr = Expr(Mean());
For Each({pair}, pairs,
f_expr = Substitute(
Expr(
(_last_numerator_ - _first_numerator_) / (_last_denominator_ - _first_denominator_)
),
Expr(_last_numerator_), Name Expr(AsColumn(dt, "B " || pair[1])),
Expr(_first_numerator_), Name Expr(AsColumn(dt, "B " || pair[2])),
Expr(_last_denominator_), Name Expr(AsColumn(dt, "A " || pair[1])),
Expr(_first_denominator_), Name Expr(AsColumn(dt, "A " || pair[2]))
);
Eval(EvalExpr(new_col = dt << New Column("B/A " || pair[1] || "-" || pair[2], Numeric, Continuous, Formula(
Expr(Name Expr(f_expr))
))));
Insert Into(avg_expr, Name Expr(AsColumn((new_col << get name))));
);
Eval(EvalExpr(
dt << New Column("B/A AVG", Numeric, Continuous, Formula(
Expr(Name Expr(avg_expr))
));
));Re: 一致する列の差分と平均を生成する JSLジャーモさん、本当にありがとうございました。 この例から、非常に多くの新しいスクリプト作成方法を学びました。 あなたの助けに感謝。
Re: 一致する列の差分と平均を生成する JSLジムさん、ご協力ありがとうございました。 とても単純明快でわかりやすいです。 感謝します!