使用表变量和列进行计算的最佳方法是什么?JSL (TestJSL) 脚本创建两个表变量。 在脚本中,它们用于通过应用 IF 状态等从现有列 :D0 计算新列 :D1。
有没有比使用相当复杂的 :D1 公式更好的方法来做到这一点?
回复:使用表变量和列进行计算的最佳方法是什么?再次感谢。 现在,通过运行更新脚本就可以了。 该公式的魅力在于数据更新是自动完成的。 使用大约 100k 行的公式执行此操作是否有风险(避免错误......)? 如果我坚持使用公式,最好生成一个列 :DT 来计算第一部分 If( :P1 == 0 & :P2 < :Threshold, :D0 ) 如果存在脚本会是什么样子有几个:D0a:D0b列才能生成对应的:D1a,.D1b列?
回复:使用表变量和列进行计算的最佳方法是什么?嗯,你的公式有效,所以你可以使用它。 我同意公式很难维护。
这是一个替代方案,将脚本添加到表中。 我添加了 JSL(在 wait(5) 之后),它展示了如何更改分位数和阈值并运行脚本。 或者以交互方式更改 2 个变量,然后单击“更新 D1”。
使用您认为最容易使用的方法。
//Create Table Variable
dt = currentdatatable();
dt << Set Table Variable( "Quantile", 0.9 );
dt << Set Table Variable( "Threshold", 1 );
dt << New Column("D1", Numeric, Continuous);
dt << New Script ("Update D1",
dt = current data table();
_xx = dt << get rows where(:P1 ==0 & :P2 <:Threshold);
dt << Set Table Variable("QQ", Quantile(dt:Quantile, dt:D0[_xx] ));
qq = Quantile(dt:Quantile, dt:D0[_xx] );
//caption(char(qq)); wait(2); caption(remove); //uncomment to test
dt:D1 << Set Each Value(
If(:P1 ==0 & :P2 <:Threshold & :D0< qq, :D0, empty())
);
);
wait(5);
dt << Set Table Variable( "Quantile", 0.6 );
dt << Set Table Variable( "Threshold", 1.8 );
dt << Run Script("Update D1") ;
回复:使用表变量和列进行计算的最佳方法是什么?感谢您的解决方案。 效果很好。 但是,执行 JSL 后,我重新调整表变量“分位数”和“阈值”,新列 :D1 仅响应“阈值”的更改,而不响应“分位数”的更改。 这个问题可以解决吗?
@gzmorgan0写道:
有多种方法可以实现此目的,无需使用设置值的表公式和表变量。
由于您的脚本使用了公式,因此此替代 JSL 使用公式。 如果不需要列公式也能完成,则可以使用其他方法,包括提示输入分位数、阈值的脚本,然后重新计算 qq 并重新计算 D1。
//Create Table Variable
dt = currentdatatable();
dt << Set Table Variable( "Quantile", 0.9 );
dt << Set Table Variable( "Threshold", 1 );
_xx = dt << get rows where(:P1 ==0 & :P2 <:Threshold);
dt << Set Table Variable("QQ", Quantile(dt:Quantile, dt:D0[_xx] ));
dt << New Column("D1", Numeric, Continuous,
Formula( If(:P1 ==0 & :P2 <:Threshold & :D0< :QQ, :D0) )
);
感谢您的解决方案。 效果很好。 但是,执行 JSL 后,我重新调整表变量“分位数”和“阈值”,新列 :D1 仅响应“阈值”的更改,而不响应“分位数”的更改。
回复:使用表变量和列进行计算的最佳方法是什么?有多种方法可以实现此目的,无需使用设置值的表公式和表变量。
由于您的脚本使用了公式,因此此替代 JSL 使用公式。 如果不需要列公式也能完成,则可以使用其他方法,包括提示输入分位数、阈值的脚本,然后重新计算 qq 并重新计算 D1。
//Create Table Variable
dt = currentdatatable();
dt << Set Table Variable( "Quantile", 0.9 );
dt << Set Table Variable( "Threshold", 1 );
_xx = dt << get rows where(:P1 ==0 & :P2 <:Threshold);
dt << Set Table Variable("QQ", Quantile(dt:Quantile, dt:D0[_xx] ));
dt << New Column("D1", Numeric, Continuous,
Formula( If(:P1 ==0 & :P2 <:Threshold & :D0< :QQ, :D0) )
);