如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我正在尝试在 Col3 中编写一个公式,将 Col1 的当前值与 Col2 的滞后值相加,但我遇到了一个问题,试图弄清楚当遇到丢失数据时如何继续从 Col2 中进行最后的观察,并且在非缺失数据的第一个实例处使用该值。那是,
If( !IsMissing( Col1)
Col1 + Lag(Col2,1);
//create variable that contains current Col2 value;
//Else
Col1 + previously stored value from Col2;
);
我将不胜感激任何有关如何最好地实现这一目标的建议。谢谢。
| 排# |
第 1 列 |
第2栏 |
第3栏 |
|---|
| 1 |
2 |
1 |
|
| 2 |
1 |
3 |
2 |
| 3 |
1 |
5 |
4 |
| 4 |
2 |
7 |
7 |
| 5 |
。 |
。 |
|
| 6 |
。 |
。 |
|
| 7 |
。 |
。 |
|
| 8 |
2 |
8 |
9 |
| 9 |
2 |
9 |
10 |
| 10 |
1 |
11 |
10 |
| 11 |
。 |
。 |
|
| 13 |
。 |
。 |
|
| 14 |
2 |
12 |
13 |
| 15 |
2 |
13 |
14 |
| 16 |
1 |
14 |
14 |
| 17 号 |
2 |
15 |
16 |
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值感谢 Jerry 的精彩解释并期待我下一个合并 ID 的问题!
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值抱歉,我没有在之前的回复中提供更多解释。 首先,要使公式适用于您的数据表,请将“If”语句中的“日期”列更改为“活检结果”,并将日期差函数中的“小时”参数更改为您需要的任何时间间隔(即“日”) ):
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) )
)
)
现在进行解释。 现有公式不会自动向后或向前索引,直到找到非缺失数据,因此我诉诸脚本来创建包含所需信息的变量。 如果您想了解有关脚本编写的更多信息,帮助->书籍->脚本指南和帮助->脚本索引都是很好的资源。
“:Biopsy Result<
接下来,如果活检结果缺失,则结果设置为缺失,否则,我们需要引用之前的非缺失日期来计算日期差异。 Contains(nm, Row()) 查找“nm”矩阵中当前行的位置。 从中减去 1 即可找到“nm”矩阵中前一行的位置。 现在这是具有上一个非缺失活检结果的行中日期值的索引,即行号。 当没有先前的非缺失行(即活检结果的第一个实例)时,“Try”函数会忽略日期差异函数生成的错误。
有几点需要记住,这假设您的数据是按 ID 号内的日期排序的(如您的示例所示)。 另外,如果数据表中有多个 ID 号,您可能需要添加另一个条件,这样就不会比较两个不同的 ID。 在这种情况下,您的公式/脚本可能如下所示:
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
If( :ID # == :ID #[nm[Contains( nm, Row() ) - 1]],
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) ),
.
)
)
)
我知道这是很多信息,但您确实说过您“渴望了解这一点”......希望这会有所帮助。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值您可能会发现数据表工具插件对这种情况很有帮助。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值谢谢杰瑞。 这看起来确实正是我所需要的。
不幸的是,我是这方面的新手,我仍然需要帮助弄清楚如何在我自己的数据库和公式编辑器中自己重新创建它。 我已在我的数据中附加了对单个患者感兴趣的列的非常简化的版本。
在我的数据库中,有许多行数据具有我们正在跟踪的实验室值,但是,只有某些行具有活检结果。 我想创建一个公式,该公式将使用“日期”列中的日期来计算活检之间发生的日期差异。
不幸的是,我不明白您使用哪些函数来创建公式...例如...虽然如果多次使用“Ismissing”函数,我什至没有在中看到“Loc Nonmissing”选项公式编辑器。
另外,“nm”是什么意思...... 我假设“某种矩阵”,但我在公式编辑器中哪里可以找到它?
抱歉打扰了,但我很想了解这一点,因为它看起来正是我所需要的。
再次感谢,
连续波
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值不幸的是,我看不到您提供的示例表,但是,随附的文件可能会为您提供一种方法来获取当前和以前的非缺失日期之间的差异。
第二列中的公式首先为“日期”列中的非缺失单元格建立行矩阵。 这提供了一种引用前一个非缺失行的方法,该行用作日期差异函数中的索引。
我确信还有其他想法可以做到这一点......
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我想做的是问这个问题......我的数据库中给定患者(第一列中的点号)的两个不同活检(标记为 TCMR 的列)之间的日期差异是多少。 活检以不规则的间隔进行,活检的结果显示在下面的第三列中。
尽管我知道如何检索此信息,但如果我只是创建包含活检结果的行的子集,然后询问日期差异......我想做的是找出一种方法来确定日期差异在任何具有活检结果的行之间,同时忽略空行。
@jerry_cooper写道:
我认为这个公式会给你你所追求的:
If(Is Missing(:Column 1), :Column 1, Summation(i = 1, Row(), :Column 1))
希望这可以帮助。
-杰瑞
你能帮忙解决这个问题吗? 理想情况下,我可以在公式编辑器中看到或粘贴到其中的解决方案。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我相信此回复是在 JMP 13 发布之前编写的,该版本引入了 Col Cumulative Sum() 函数。 如果您使用的是 v13 或更高版本,创建累积总和列所需要做的就是右键单击要求和的列的列标题,然后选择新建公式列=>行=>累积总和。 这将使用适当的公式创建一个新列。 要在编辑器中查看公式,请右键单击新列并选择公式。
如果您使用的是早期版本,请将以下语句复制并粘贴到公式编辑器中以查看其外观:
Summation(i=1, Row(), Your Column[i])
希望这可以帮助。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我认为这也正是我所需要的,但我不完全理解该脚本......是否可以在公式编辑器中显示它的样子......
非常感谢
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我一直遇到这个问题并使用Jerry给出的解决方案。 我分析从压缩数据历史记录中检索到的过程测量值(温度、压力、流量等)。 每几千个点,就可能有一个缺失值。
下面的示例根据催化剂流量的 3 点移动平均值计算反应器是否正在运行,F.Cat >= 11(匿名是的,您会得到参考...)。 如果缺少 F.Cat,则 calc 将使用上一行的“正在运行?”值。
If(
Row() < 3, 0,
Is Missing( :F.Cat ), Lag( :Name( "Running?" ), 1 ),
(Lag( :F.Cat, 2 ) + Lag( :F.Cat, 1 ) + :F.Cat) / 3 >= 11, 1,
0
)
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />感谢大家的评论和帮助。
我认为杰里的建议最适合我,并且不需要使用我想要使用的局部变量。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我认为这个公式会给你你所追求的:
If( Is Missing( :Column 1 ),
:Column 1,
Summation( i = 1, Row(), :Column 1 )
)
希望这可以帮助。
-杰瑞
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我们是否总是能够让列公式具有自我引用性?我从来没有意识到我能做到这一点。
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值谢谢吉姆和杰夫,
我认为我使问题变得比我的描述和表格布局中需要的更加复杂,并且可以看到这如何导致您提出建议。
虽然我理解杰夫关于创建一个包含非缺失数据的新列的建议,但我希望在不创建新列的情况下完成我的工作,因为我将在许多不同的列中使用这个公式。让我尝试通过下表更清楚地说明我想要完成的任务。
我正在尝试在第 2 列中创建第 1 列的运行总和。在不创建任何其他列的情况下,我希望创建一个变量,其中包含第 2 列中的当前运行总和值,并将其添加到第 1 列的值中。
我的问题是不知道创建和使用包含第 2 列当前值的变量的最佳方法,以便可以在缺少第 1 列数据的行之间“携带”该值。“我正在寻找的结果”列显示了我希望第 2 列中的公式产生的结果。希望这个描述能更清楚地说明我想要完成的任务。

回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值我认为您的描述中有一个错误,我们必须先澄清该错误,然后才能为您提供准确的解决方案。 您的条件表示,如果 Col1 不丢失,则将其添加到 Col2 的滞后值,如果 Col1 丢失,则将其添加到先前存储的 Col2 值。
您无法将缺失的 Col1 添加到任何内容中并获得除缺失之外的任何内容。
话虽如此,我会一次一列地构建这个表。 具体来说,我将使用以下公式创建一个没有缺失值的“非缺失 Col2”列:

当 Col2 不缺失时,此公式将“非缺失 Col2”设置为 Col2;当 Col2 缺失时,将其设置为“非缺失 Col2”的滞后。

然后,您可以在最终公式中使用 Lag(non-missing Col2, 1)。
我希望这有帮助。
-杰夫
回复:如果不丢失,则使用以前的值的公式,否则使用最后占用的单元格中的值这是有效公式的一种版本:
If( Row() == 1, lagval = . );
x = Sum( :col 1, lagval );
If( Is Missing( col 2 ) == 0,
lagval = :col 2
);
x;