在矩阵上使用If Then<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />嗨伙计,
由于重新调整仪器,我有一些仪器数据会定期显示数据的大变化。 我正在尝试创建一个执行以下操作的新变量:If(data - 数据[i-1]> 4)或(数据 - data [i-1] < - 4),然后是adj_data = adj_data [i-1],Else,data = adj_data +(数据 - 数据[i-1]);基本上,如果当前数据值超过前一个值4或-4,则使新的调整值等于先前的调整值,否则,将当前和先前数据值之间的差值添加到调整值。
我已经想出如何将数据读入矩阵并删除任何丢失的数据,但我不确定如何在矩阵上完成上述数学运算。 任何关于如何实现这一点的建议将不胜感激。
清除日志();
名称默认为此处(1);
dt =新表(“调整缺失数据”,
添加行(24),
保存时压缩文件(1),
新栏目(“日期”,
数字,
连续,
格式(“m / d / y”,19),
输入格式(“m / d / y”),
设定值(
[3447619200,3447705600,3447792000,3447878400,3447964800,
3448051200,3448137600,3448224000,3448310400,3448396800,
3448483200,344569600,3488656000,3448742400,3448828800,
3448915200,3449001600,3449088000,3449174400,3449260800,
3449347200,3449433600,3449520000,3449606400]
)
)
新栏目(“Data1”,
数字,
连续,
格式(“最佳”,12),
设定值(
[11,13,50,15,。,17,18,-20,20,。,21,22,。,24,25,23,。,。,。
。,。,25,26,27,28]
)
)
新栏目(“Adj Data1”,
数字,
连续,
格式(“最佳”,12),
设定值(
[0,2,。,4,。,6,7,。,9,。,10,11,。,13,14,12,。,。,。,。,14,
15,16,17]
)
)
);
//将相关数据放入矩阵中
date_time =:名称(“日期”)<<获取值;
data =:Name(“Data1”)<<获取值;
//确定仅包含未丢失数据的行
row_list = dt <<获取行所在的位置(
和(
!缺少(:Data1),
包含(data,:Data1),
包含(data,:Data1)== Contains(date_time,Format(:Date,“mdy”))
)
);
//将row_list(当前为矩阵[])转换为列表{}
是List(row_list = As List(row_list));
date_time = date_time [Loc(!Is Missing(data))];
data = data [Loc(!Is Missing(data))];
Re:在矩阵上使用If Then对不起杰夫我不太清楚我想要完成什么。 通过讨论JSL代码和列公式,我可能会感到困惑。
附加的数据文件显示:adj_data1中的“所需”输出和新调整数据中提供的列公式的输出。 请注意,新调整数据列在以下情况下插入先前的新调整数据值:数据1丢失,即使目标是在以下情况下让新调整数据显示缺少数据:data1丢失。
为了创建:adj_data1列,我试图调整您的列公式,以便:
- 当:data1丢失时,先前的新调整数据值被放入局部变量并继续运行,直到在步骤2中需要
- 如果当前:data1值未丢失且上一个:缺少data1值,则将新调整数据设置为局部变量中的当前值列表。
在我挂起的地方是将第1步中的New Adj Data值添加到局部变量,然后在步骤2中检索/使用该值。
也许我让它变得比它需要的更复杂,你有一个简单的方法来实现这一点。 我当然感谢您提供的任何帮助。 如果你的解决方案没有在列公式中使用局部变量,如果你能提供一个如上所述使用局部变量的简单示例,或者指向现有的JMP数据集,我也将不胜感激。在列公式中使用局部变量。 看起来能够在列公式中成功使用局部变量会非常有帮助。 再次感谢。
Re:在矩阵上使用If Then您对如何使用列公式中的局部变量完成以下JSL代码有任何指导吗?
如果要在JSL程序中定义变量,并希望在列公式中使用它们,则它们必须是全局变量。 使用“::”作为变量的前缀,您可以在列公式中使用它们。 例如 :: g_one_variable
Re:在矩阵上使用If Then嗨Terapin,
我担心根据您发送的JSL,我很难解读您想要做的事情。
我上面附加的数据表处理data1中缺少的值,而不需要公式中的局部变量。它检查当前行或前一行中是否缺少Data1,而是缺少(:Data1 - Lag(:Data1,1))。如果其中任何一个缺失,那么差异也将丢失。
这是New Adj Data列中的公式:
如果(
Row()== 1,0,
Abs(:Data1 - Lag(:Data1,1))> 4 |丢失(:数据1 - 滞后(:数据1,1)),滞后(:新调整数据,1),
滞后(:新调整数据,1)+(:数据1 - 滞后(:数据1,1))
)
如果这不是您所需要的,您可以发布一个样本数据表,并准确说明您希望每个行中基于这个新公式的列的值是什么?这将帮助我准确理解你在寻找什么。
谢谢!
-Jeff
Re:在矩阵上使用If Then感谢Jeff提供列公式的示例以及矩阵示例。正如您可能想象的那样,我的情况稍微复杂一些,需要我跳过数据丢失的行,但是继续前面调整的数据值。 我可以使用以下JSL代码完成此操作,但无法弄清楚如何在列公式中使用局部变量。 您对如何使用列公式中的局部变量完成以下JSL代码有任何指导吗?谢谢。
清除日志();
lag_adj_data = 0;
:adj_data1 [1] = 0;
对于(i = 2,i <= N行(dt1),i ++,
如果(Abs(:data1 - :data1 [i - 1])> 4,
:adj_data1 =:adj_data1 [i - 1],
:adj_data1 =:adj_data1 [i - 1] +(:data1 - :data1 [i - 1])
);
如果(缺失(:data1 )&!缺少(:adj_data1 [i-1]),
lag_adj_data =:adj_data1 [i-1];
);
如果(缺少(:data1 [i-1])&!缺失(:data1 ),
:adj_data1 = lag_adj_data
);
);
Re:在矩阵上使用If Then正如我昨天所提到的,一般来说,列公式非常有效。
请参见附件数据表。新调整数据列的公式接近您要查找的内容。
这仍然是一个小数据集,但它仍然可以很好地用于许多行。
-Jeff
Re:在矩阵上使用If Then矩阵像常规变量一样工作 - 更准确地称为标量 - 与大多数算术和比较运算符。
例如:
X = [ 1 , 2 , 3 , 4 ] ;
ÿ = [ 2 , 1 , 2 ,五 ] ;
X > ÿ ;
/ *:
[0,1,1,0]
如您所见,我现在有一个矩阵,指示y矩阵大于x矩阵的位置。
但是,您不仅限于将一个矩阵与另一个矩阵进行比较。您也可以与标量进行比较。
X > 2 ;
/ *:
[0,0,1,1]
我也可以一次对整个矩阵进行算术运算。
X - 4 ;
/ *:
[-3,-2,-1,0]
您可以索引矩阵以仅获取矩阵的一部分,以便您可以轻松地将矩阵的一部分与另一部分进行比较。
ÿ [ 2 :: nrow ( ÿ )] > ÿ [ 1 :: nrow ( ÿ ) - 1 ] ;
/ *:
[0,1,1]
您还可以在矩阵上使用函数。
ž = [ 1 ,五 , 1 - 6 ] ;
ABS ( ž [ 2 :: nrow ( ž )] - X [ 1 :: nrow ( ž ) - 1 ]) > 4 ;
/ *:
[0,0,1]
结合所有这些,你应该能够用矩阵做你正在寻找的东西。
但是,数据表中的列公式会更直接,也可能同样有效。我明天将跟进一个例子。
-Jeff
Re:在矩阵上使用If Then感谢PMroz的建议。 这肯定会对表中的数据起作用,但是该表有大约500,000条记录,我认为在矩阵中进行调整比直接处理数据表要快。 您对在矩阵上使用条件命令的语法有什么建议吗?我查看了各种JMP“书籍”,但没有找到任何明确指定语法的内容。 谢谢。
Re:在矩阵上使用If Then我想这会做你想要的。 我直接在你的桌子上操作,顺便说一句。
DT = 数据表 ( “调整缺失的数据” ) ;
对于 ( 一世 = 2 ,一世 <= NROWS ( DT ) ,一世 ++,
迪 = 柱 ( DT , “数据1” ) 一世 ] ;
DIM1 = 柱 ( DT , “数据1” ) 一世 - 1 ] ;
ADJI = 柱 ( DT , “Adj Data1” ) 一世 ] ;
如果 ( !不见了 ( 迪 ) & !不见了 ( DIM1 ) ,
如果 ( ABS ( 迪 - DIM1 ) > 4 ,
// 然后
柱 ( DT , “Adj Data1” ) 一世 ] = 柱 ( DT , “Adj Data1” ) 一世 - 1 ] ;
,
//别的
如果 ( !不见了 ( ADJI ) ,
柱 ( DT , “数据1” ) 一世 ] = ADJI + ( 迪 - DIM1 ) ;
) ;
) ;
) ;
) ;