For Loop不能正确评估公式。<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我正在尝试在数据表中创建新列,每个新列都是现有列的Z分数。 这就是我所拥有的
Colnames_1st = dt_zscore3 <<获取列名();
nlist = N项(Colnames_1st);
for(i = 5,i <= 10,i ++,
var1 = Column(Colnames_1st );
mean = Col Mean(var1);
stdev = Col Std Dev(var1);
namevar = char(Colnames_1st );
新栏目(“Zscore”|| namevar,
数字,连续,
格式(“最佳”,12),
公式((((var1 []) - mean)/ stdev)));
);
代码创建了6个新列并正确命名。
但是当它填写所有列中的值时,它无法正确执行。
所有列在每行中都以相同的值结束。 它看起来像我喜欢它
正在创建列,但是等待直到for循环结束才能计算出来
在所有列的每一行中的值,因此它使用all的最后一个值
所有列的变量,而不是计算每个列的公式
列使用该列应使用的值。
我真的被卡住了。 我尝试过各种各样的事情,但无法克服这个障碍。
任何帮助将非常感激。
Re:For Loop不能正确评估公式。我认为您的解决方案可能存在问题。它可以在创建列时工作,但不能在另一个会话中工作,或者在源列中更改或添加数据。
如果你看一下新列中的公式,我怀疑它们看起来都像“(var1 [] - mean)/ stdev”。这些变量名只在当前脚本上下文中有意义(甚至在特定的for循环迭代中。如果重新定义或清除变量,则公式将无法正常工作。
应该按字面输入公式,因为Formula()参数中的变量显然没有被计算,而是按字面意思来计算。如果必须使用变量,例如在for循环中,这可以通过操纵字符串或表达式来实现。
在评估表达式之前使用evalexpr()评估表达式中的表达式的示例:
DT = 打开 ( “$ SAMPLE_DATA / Big Class.jmp” ) ;
ñ = N Col ( DT ) ;
对于 ( 一世 = 4 ,一世 <= ñ ,一世 ++,
VAR1 = 柱 ( 一世 ) ;
EVAL (
Eval Expr (
DT << 新栏目 ( “Zscore” || ( VAR1 << 得到名字 ) ,
数字 ,
连续 ,
式 ( Col标准化 ( EXPR ( VAR1 ) ) )
)
)
) ;
) ;
Re:For Loop不能正确评估公式。我想我终于找到了解决方案。
我有一种感觉,我的问题在某种程度上将变量定义为本地和全局,但无论我尝试什么,我都无法弄清楚如何以这种方式修复它。
相反,我添加了这条线
dt_zscore3 <<运行公式
现在它正确地做到了。
Colnames_1st = dt_zscore3 <<获取列名();
nlist = N项(Colnames_1st);
for(i = 5,i <= nlist,i ++,
名称默认为此处(1);
var1 = Column(Colnames_1st );
// var1 = Column(Colnames_1st );
mean = Col Mean(var1);
stdev = Col Std Dev(var1);
namevar = char(Colnames_1st );
新栏目(“Zscore”|| namevar,
数字,连续,
格式(“最佳”,12),
公式((((var1 []) - mean)/ stdev)));
dt_zscore3 <<运行公式
);
这可能不是优雅或最正确的方式,但我发布它以防任何人发现它有用。