JSL 脚本用于过滤掉特定列包含缺失值的整行亲爱的社区:
我是一名新手用户,希望您能帮助我解决以下代码问题。“is missing”函数的参数似乎不正确。
我希望脚本显示一个表格,其中显示包含特定范围内的值的行。此外,用于过滤的两列中含有空单元格的行将被排除。
代码如下:
dt = Current Data Table(); // Assumes you have a data table already opened
// Convert Column1 to numeric data type
dt << As Numeric("Temperatur");
// Convert Column2 to numeric data type
dt << As Numeric("Menge");
// Create the conditions to filter the rows
condition1 = Column(dt, "Temperatur") << Get Values() > 25;
condition2 = Column(dt, "Menge") << Get Values() > 0;
// Create a condition to remove empty cells
condition3 = Any(Is Missing(dt << Get Values("Temperatur"))) == 0 | Any(Is Missing(dt << Get Values("Menge"))) == 0;
// Apply all three conditions to filter the data table
filtered_dt = dt << Select Where(condition1 & condition2 & condition3);
// Show the filtered data table
filtered_dt << Show();
非常感谢您的指导。我使用的是 JMP 版本 17
迈克尔
自动化和脚本回复:JSL 脚本用于过滤掉特定列包含缺失值的整行非常感谢,Jthi,在你的帮助下我成功了!
回复:JSL 脚本用于过滤掉特定列包含缺失值的整行非常感谢,Hogi,在你的帮助下我成功了!
回复:JSL 脚本用于过滤掉特定列包含缺失值的整行您正在混合矩阵比较和数据表选择,在这种情况下,您很可能只想使用 << Select Where 或 << Get Rows Where 而不是 << Get Values (您可能想要使用<< Get Rows Where而不是<< Select Where但这取决于您想做什么)。
您可以将条件直接组合成一个 Select Where 语句(如果您想将它们分开,我会使用注释来做,除非您希望重复使用完全相同的语句)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
dt << Select Where((:height > 60) & (:weight > 90));
selrows = dt << get selected rows; // to get a matrix of selected row numbers
r = dt << Get Rows Where((:height > 60) & (:weight > 90));
在这种情况下,不需要检查那些缺失的值
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
r1 = dt << Get Rows Where((:height > 60) & (:weight > 90) & (!IsMissing(:height) | !Is Missing(:weight)));
r2 = dt << Get Rows Where((:height > 60) & (:weight > 90));
r1 == r2;回复:JSL 脚本用于过滤掉特定列包含缺失值的整行嗨,米哈尔。
JMP 中很酷的一点是:您不需要了解任何脚本,只需使用 GUI 和鼠标即可。
然后执行完步骤之后就可以进入高级日志检查代码了......
- 行/行选择/选择位置 (Ctrl + W)

- 打开选定行的数据视图:

- 检查日志:

Jmp 了解你想要什么 - 甚至将两个步骤合并为一行代码:

如果您想自己构建命令,您可以定义一些字符串,将它们连接起来,然后解析并评估最终的代码:
cond1 = "Is Missing( :age )";
cond2 = ":age > 16";
Eval(Parse("dt << Select where( "|| cond1 || " | " || cond2 || " ) << Data View;"))
我的建议:花些时间学习和理解表达式处理
很棒的教程: 使用 JSL 开发高效、强大的应用程序 (EU 2018 415),作者: @joseph_morgan
您会发现,实际上它与您的方法非常相似:
将一些条件存储为 JSL“符号”条件 1、条件 2......然后使用它们构建最终表达式并对其进行评估。
通过对一些代码进行修复以及在这里和那里使用 Expr()和Name Expr() (以防止 Jmp 在将条件插入到最后一行代码之前对其进行评估),代码应该如下所示:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
condition 1 = Expr(Is Missing( :age ));
condition 2 = Expr(:age > 16 );
combined condition=Expr(or());
Insert into(combined condition, Name Expr(condition1));
Insert into(combined condition, Name Expr(condition2));
Eval(Substitute(dt << Select where( _cond_ ) << Data View),
Expr(_cond_),Name Expr(combined condition)));