JSL生成匹配列差值和平均值你好,
我希望在以下方面得到一些帮助:
附有下表的 JMP 文件。

我的典型/起始数据集包含:
1. 标识符“类型”
2.一组未知数量的具有相同前缀和不同数字后缀的列,例如 一个数字 1,一个数字 2,一个数字 3...
3. 第二组与上面 #2 中相同数量的列,具有与 #2 中相同的前缀和匹配后缀,例如 B num1、B num2、B num3...
我可以得到一些帮助来编写一个 jsl 脚本来生成列来配对 A 组和 B 组列来计算:
公式( (: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”的最后一列,如果可以简化脚本,则临时列是可选的。
如果我可以澄清我的问题中的任何内容,请告诉我。 预先非常感谢。
自动化和脚本编写基础数据分析和建模回复:JSL 生成匹配列差值和平均值什么决定了用于计算的列对?
回复:JSL 生成匹配列差值和平均值具有相同的后缀(数字)。 例如,0.5至0.5、1.0至1.0、1.3至1.3等...
回复: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) 列?
回复: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)。 这样,平均值仍然与较高-较低相同。
回复: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, "," ) || ")));"
)
);回复: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))
));
));回复:JSL 生成匹配列差值和平均值非常感谢贾莫。 从这个例子中学到了很多新的脚本编写方法。 感谢你的帮助。
回复:JSL 生成匹配列差值和平均值非常感谢你,吉姆,你的帮助。 非常简单易懂。 欣赏它!