Col Cumulative Sum 不调用当前行的值您好,我对编写 JMP 脚本还很陌生,主要在工作中使用“编辑公式”。我一直在浏览与Col Cumulative Sum相关的解决方案,但找不到适合我的具体问题的解决方案。我的数据表的简化版本如下。
| 排 | 星期 | Col Cumulative Sum | 我的希望 |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 3 | 1 |
| 3 | 3 | 6 | 3 |
| 4 | 4 | 10 | 6 |
| 5 | 5 | 15 | 10 |
| 6 | 6 | 21 | 15 |
如果“周”的当前行值是固定的或者如果我有两个单独的列“周”和“我的愿望”,则下面的公式有效。
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
问题是前一行的“周”值是固定的,但当前行的值不是。而且我只有一列“周”可以使用。我正在开发一个公式,根据上一个模拟值模拟进展。我正在根据前一行的值模拟当前行的“周”值。
假设我正在处理“周”列中的第 4 行。我想累积所有以前的“周”值的总和,而不调用函数中当前的“周”值。否则,在我的例子中,它会产生非法引用或循环问题。
我尝试使用下标而不是滞后,因为滞后函数调用当前行的“周”值。它不起作用。
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
我希望我的解释足够清楚。提前感谢您的宝贵时间和专业知识。我使用 JMP Pro 17。
自动化和脚本预测建模和机器学习回复:Col Cumulative Sum 不调用当前行的值您可以从累计金额中扣除当前周的价值
Col Cumulative Sum(:Week) - :Week

回复:Col Cumulative Sum 不调用当前行的值您好,我通过论坛和观看讲座视频学到了很多有关编写 JSL 脚本的知识。我对以下脚本有一个后续问题。第二行也得到了相同的结果。请问您为什么选择第一行而不是第二行?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
此外,有没有办法避免修改“R”列并保留原始值?我希望修改后的 R 值保留在“Cases”列中而不出现在任何地方。我尝试为修改后的 R 分配一个不同的变量名“Rx”,如下所示。但是,这种方法需要我创建一个名为“Rx”的空列才能工作。
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
非常感谢您付出的时间和专业知识。
回复:Col Cumulative Sum 不调用当前行的值“模拟案例”是矩阵还是数据表中的一列?
我不明白
您的解决方案似乎过于复杂了。
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
sum1 和 sum2 都提供相同的值
sum1 = 18;
sum2 = 18;
我鼓励您阅读“帮助”下拉菜单下的“发现 JMP”文档。
回复:Col Cumulative Sum 不调用当前行的值这是我的解决方案,但它与您的解决方案不符。我认为您显示的计算对于第 3 行不正确。请查看我的脚本,其中包含您的示例数据表。
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 4 ),
New Column( "R",
Numeric,
"Continuous",
Set Values( [., 1.4, 1.67, 2.3] )
),
New Column( "Cases",
Expression,
"None",
Set Values( {[1, 1, 2, 1], Empty(), Empty(), Empty()} )
)
);
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) );
:R[i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * :R[i];
casesSum = casesSum + sum(casesMatrix);
);
// Row 3 R does not seem to be correct
// I can not come up with .71, I come up with .96192
show(1.4 * (1 - (5 * 4/100)) );
show(1.67 * (1 - (10.6 * 4/100)) );

回复:Col Cumulative Sum 不调用当前行的值你建议的第二行很棒。我使用这个语法的原因只是出于一个老习惯。
无需创建空列即可使用 Rx,方法是将其用作内存变量引用。以下是执行此操作的代码
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( casesMatrix = Expr( :cases[i - 1] ) );
Rx = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * Rx;
casesSum = casesSum + sum(casesMatrix);
);
回复:Col Cumulative Sum 不调用当前行的值我会使用单独的列来避免各种问题,但我不确定您想要实现什么,因为您的示例中有完整的数据。如果 Col Cumulative Sum 对您不起作用(使用 Lag 和变量计算值),也许可以这样做
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
回复:Col Cumulative Sum 不调用当前行的值感谢您对使用Index下标的建议。我现在遇到了“对象不可下标”的问题。
我的周示例过于简单,我有一个 4 行 1 列的矩阵Sim Cases来代替周。为了将其转换为一个汇总数值,我将矩阵乘以 [1 1 1 1] 并添加下标 [ 1 ]。然后是Index下标。
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
我认为原始 4x1 矩阵的结果数值不接受 [ 1 ] 之后的任何下标。或者可能是因为再次出现非法引用(递归)。
回复:Col Cumulative Sum 不调用当前行的值是的,起初,我尝试在 JMP 数据表中模拟我在 Excel 电子表格中通常所做的操作,即通过分隔列。然后,我将前一行的值称为不同的列。JMP 数据表的行为与 Excel 电子表格不同,我遇到了周期性问题。
因此,我不断改变策略,我现在的理解是将每个必需的变量放在一列中,以避免循环问题。
回复:Col Cumulative Sum 不调用当前行的值大家好。我正在重新措辞我的问题,希望可以消除你的沮丧。
| 排 | R | 案例 |
| 1 | . | [1, 1, 2, 1] |
| 2 | 1.4 | |
| 3 | 1.67 | |
| 4 | 2.3 | |
我有 2 列, R和Cases。Cases是通过将当前行的R与上一行的Cases相乘来计算的。此外,需要根据上一行的Cases总和修改(减少) R 。
案例列中的R (第 2 行)= R (第 2 行)* 修饰符
修饰符 = 1 - ( (从第 1 行到当前行前一行的案例累计总数* 4 ) /总人口)
总人口是一个参数,为 100。
由此产生的修饰符 与第 1 行中的案例相乘以创建第 2 行中的案例。
例如,我期望修改后的R (row2) 为 1.12,案例(第 2 行)为 [1.12, 1.12, 2.24, 1.12]
1.4 * 1-( 5 * 4/100 ) = 1.12
1.12 * [1, 1, 2, 1] = [1.12, 1.12, 2.24, 1.12]
然后,我预计修改后的R (第 3 行)为 0.71,案例(第 3 行)为 [0.8, 0.8, 1.6, 0.8]
1.67 * 1-( 10.6 * 4/100 ) = 0.71
10.6来自第 1 行的5 个案例和第二行的5.6 个案例。
0.71 * [1.12, 1.12, 2.24, 1.12] = [0.8, 0.8, 1.6, 0.8]
我在获取绿色值时遇到了问题。我目前尝试编写 JMP 脚本,如下所示。
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
我尝试了Index 、 Lag 、 Row() - 1 、 Col 累计和 、 Summation等来获取修饰符,但都没有奏效。我主要得到
1) 非法引用或
2) 不可下标
再次感谢您付出的时间和专业知识。
回复:Col Cumulative Sum 不调用当前行的值非常感谢。 for循环似乎是这里的关键。 我还没有学习Eval 、 Eval Expr和Expr这些函数。
你是对的,我在例子中的计算是错误的。
回复:Col Cumulative Sum 不调用当前行的值当我在公式中使用 (:Week) 时,出现了非法引用问题。当前行 (:Week) 尚未完全计算。理论上,我只能从上一行调用 (:Week)。
回复:Col Cumulative Sum 不调用当前行的值如果我理解正确的话,我认为这可能是解决方案
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
回复:Col Cumulative Sum 不调用当前行的值我会继续学习 JMP。目前,我只会坚持使用 Excel 电子表格。感谢大家的回复。
Sim Cases是一列,我在创建新行时使用了前几行的Sim Cases 。所以我猜想它既是一列,又是同一列内的变量。
回复:Col Cumulative Sum 不调用当前行的值JMP 表格和电子表格的行为方式完全不同,这篇旧帖子可能值得一读, JMP 不是电子表格,因为它提供了一些示例和解释。您可以在 JMP 中完成大部分工作,但可能需要一些时间才能理解 JMP 中列+行的行为方式与 Excel 中单个单元格的行为方式。
回复:Col Cumulative Sum 不调用当前行的值此脚本以 txnelson 的解决方案为起点,并对其进行了一些修改。此脚本的目的仅是为您提供其他示例,以便您学习使用其他技术(例如使用 For Each Row 而不是 For 循环、从 :R 获取矩阵值以及其他一些修改)。
Names Default To Here(1);
dt = New Table("Example",
Add Rows(4),
New Column("R", Numeric, "Continuous", Set Values([., 1.4, 1.67, 2.3])),
New Column("Cases", Expression, "None", Set Values({[1, 1, 2, 1], Empty(), Empty(), Empty()}))
);
r_m = :R << Get values;
casesSum = 0;
For Each Row(dt,
If(Row() == 1, Continue()); // skip first row
casesMatrix = Lag(:cases, 1);
r_m[Row()] = r_m[Row()] * (1 - (Sum(casesMatrix) + casesSum) * 4 / 100);
:Cases = casesMatrix * r_m[Row()];
casesSum = casesSum + Sum(casesMatrix);
);