<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我使用两种方法来创建公式列,具体取决于我是否知道公式需要多少个变量
- Expr 和 Replace 很容易阅读。 代码中的第 1 部分为mean( 列表中的每个变量创建了多个公式列var, 拜瓦尔)
- 解析和 eval 以及可能的 eval insert 创建一个需要多个变量的公式列,数量和名称由变量列表设置。
- 第 2a 和 2b 节有效且功能相同
- 第 2c 和 2d 部分未运行,但似乎是通往优雅解决方案的道路
我想要创建更好的实践的想法,并且希望得到建议
名称默认为此处( 1 );
n=ntable();
dtnms={};
如果(
n==0,dtc=1,
n==1, If(当前数据表() << get name == "大类", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, 数据表(ii) << getname));
if(包含(dtnms, "大类") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = 数据表("Big Class"));
// 第 1 部分:添加几列动态输入变量的公式。
形式1=表达式(
form1col=dt << 新列(名称, 公式(col 平均值(作为列(YVar), 作为列(ByVar))))
);
VarList={"性别","身高","体重"};
For(ii=2, ii <= N Items(VarList), ii++,
Eval(替换(名称 expr(form1),
expr(名称), VarList[ii]||"平均值",
expr(YVar), VarList[ii],
expr(ByVar), VarList[1],
));
);
// 第 2 部分:对变量列表中的列进行平均
// 方法2a 方法可以工作,但是很难调试
VarList={"身高","体重","年龄"};
Formtxt1 = "formcol = dt << new column(\!"方法a:平均值\!", 公式(mean( ";
Formtxt2 = "As Column(\!""||VarList[1]||"\!")";
如果(
N 项(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N 项(VarList)>2, For(ii=2, ii <= N 项(VarList), ii++,
Formtxt2 ||= ", As Column(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
评估(解析(Formtxt));
// 方法 2b:更容易看到
col4=表达式(
NewCol1=dt << 新列("方法 b:"||_names_ 的平均值);
);
form4txt="NewCol1 <<公式(Mean( ^_Vars_^ )))";
VarList={"身高","体重","年龄"};
VarRef = eval list(dt << 获取列引用(VarList));
_Vars_ = "As Column( \!"" || ConCat Items(VarList, "\!"), As Column( \!"") || "\!")";
form4txta = 评估插入(form4txt);
Eval(替换(名称 expr(col4),
expr(_names_), concat Items(VarList,", ",)
));
评估(解析(form4txta)); //Parse 使文本成为要计算的 expr
// ************************************** //
// ************* 不工作 ************* //
//方法2c:我认为这是最好的,但我不能使它正确 - 仍然有一个列表
形式3=表达式(
NewCol=dt << 新列("平均值"||_names_, 公式(Mean(_Vars_ )));
);
VarList={"身高","体重","年龄"};
VarRef = eval list(dt << 获取列引用(VarList));
Eval(替换(名称 expr(form3),
expr(_names_), concat Items(VarList,", ",),
expr(_Vars_), VarRef
));
// 方法2d:使用循环,但仍然不正确
形式4=表达式(
NewCol=dt << 新列("平均值"||_names_, 公式(Mean(_Vars_ )));
);
VarList={"身高","体重","年龄"};
VarRef = eval list(dt << 获取列引用(VarList));
Form4a =替换(名称 expr(form4),
expr(_names_), concat Items(VarList,", ",)
);
For(ii=1, ii <= N Items(VarList), ii++,
form4a=替换(名称 expr(form4a),
expr(_Vars_), expr(VarRef[ii], _Vars_)
);
);
Eval(替换(名称 expr(form4a),
expr(_Vars_), ""
));
// ************************************** //
// ************* 不工作 ************* //
不同方法的很好的集合。
最近,在这种情况下,我开始更喜欢使用表达式而不是字符串。 为了通过 JSL 设置公式,我首先使用 EvalExpr() 构建表达式,然后使用 NameExpr() 插入该表达式以避免在运行时求值。
下面是两个基于列名列表或字符串列表的示例,后者更具挑战性。
dt =打开( “$SAMPLE_DATA/大类.jmp” ) ;
// 1. 列名称列表
L1 = {年龄,高度,重量} ; // 即 dt<< 获取列名(数字);
表格1 =求值表达式(意思是(表达式( L1 ))) ;
表格1列= dt <<新专栏(连接项目(字(查尔( L1 ) , “{},” )) || “ 平均的” ,公式(名称表达式(表格1 ))) ;
// 2. 字符串列表
L2 = { “年龄” , “高度” , “重量” } ; // 即 dt<< 获取列名(数字,字符串);
表格2 =求值表达式(
意思是(
表达式(
重复(
我= 0 ;
{我++ ;求值表达式(作为列(表达式( L2 [我])))} ;,
N 项( L2 )
)
)
)
) ;
表格2列= dt <<新专栏(连接项目( L2 ) || “ 平均的” ,公式(名称表达式(表格2 ))) ;