如何在没有循环的情况下检查列表内容是否全部为数字你好,
我正在编写一些导入数据的代码,我想做一些类似于 python 的 MessyTables 的数据检查。
由于数据中存在“NULL”或类似内容,数据可能会被意外导入为字符。 删除这些常见实例后,我想再次检查数据以查看它是否为数字。
最简单的方法是在删除列表中项目周围的任何“”后使用 Try() 和 Matrix()。
我可以遍历 columnKeys,如果 Num() 转换失败触发 Throw(),如果表很长并且列有许多唯一数字,这将是一种浪费。
下面的代码将错误写入 long,这很好。 然而,一旦我将它合并到我的加载项中,它也会触发一个 JMP 警报窗口,但如果我直接运行它则不会。
关于检查列表是否为数字或抑制 JMP 警报对话框的替代方案的任何建议?
谢谢,
斯蒂芬
dt = New Table( "Check Data",
Add Rows( 2 ),
New Column( "Column 1", Character, "Nominal", Set Values( {"+1%", "2", "-45"} ) )
);
a = Column(dt, "Column 1" ) << Get Values;
Try(
b = Matrix( Parse( Substitute( Char( a ), "\!"", "", " " ) ) );
Show( "Converted to Numeric." );
Show(b);
,
Show( "Not all Numeric..." );
Show(a);
);回复:如何检查列表内容是否全部为数字而没有循环谢谢你! 几个小时以来,我一直在寻找这样的东西。回复:如何检查列表内容是否全部为数字而没有循环可能应该从列表中删除任何缺失值,因为这也会导致问题。
Names Default to here(1);
a = {"1", "2", "", "45", "", "3"};
x = repeat(1, nitems(a));
x[loc(a, "")] = 0;
a = a[loc(x)];
Batch Interactive(1);
cap = Log Capture(
Try(
Parse( "[" || Concat Items( a, "," ) || "]" );
result = "ok";
,
result = "bad"
)
);
Batch Interactive(0);
Show( result );回复:如何检查列表内容是否全部为数字而没有循环<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />克雷奇@JMP谢谢,这很有用,我相信我会再次将它与其他 try 语句一起使用。
回复:如何检查列表内容是否全部为数字而没有循环最后,要取消对话框,请使用 BatchInteractive 函数。请注意有两个调用,一个之前,一个之后。如果您让 JMP 在 BatchInteractive(1) 状态下运行,您将很难关闭 JMP。
dt = New Table( "Check Data",
Add Rows( 2 ),
New Column( "Column 1", Character, "Nominal", Set Values( {"1", "2a", "-45"} ) )
);
a = Column( dt, "Column 1" ) << Get Values;
Batch Interactive(1);
cap = Log Capture(
Try(
Parse( "[" || Concat Items( a, "," ) || "]" );
result = "ok";
,
result = "bad"
)
);
Batch Interactive(0);
Show( result );
回复:如何检查列表内容是否全部为数字而没有循环并抑制日志消息:
dt = New Table( "Check Data",
Add Rows( 2 ),
New Column( "Column 1", Character, "Nominal", Set Values( {"1", "2", "-45"} ) )
);
a = Column( dt, "Column 1" ) << Get Values;
cap = Log Capture(
Try(
Parse( "[" || Concat Items( a, "," ) || "]" );
result = "ok";
,
result = "bad"
)
);
Show( result );
回复:如何绕过 parse("a+b)") 错误? 讨论了 logcapture 和 try。
编辑:删除了对结果的冗余分配。
回复:如何检查列表内容是否全部为数字而没有循环这是您最初想法的变体:
dt = New Table( "Check Data",
Add Rows( 2 ),
New Column( "Column 1", Character, "Nominal", Set Values( {"1", "2%", "-45"} ) )
);
a = Column(dt, "Column 1" ) << Get Values;
try(parse("["||concatitems(a,",")||"]"),"nope");
回复:如何检查列表内容是否全部为数字而没有循环这看起来相当快。 它只使用 JMPs 功能(?),如果列指定为数字,它只是将非数字值转换为缺失值。
*编辑速度*
lista = {"+1%", "2", "-45", ""};
dt = New Table( "Check Data",
New Column( "Character", Character, "Nominal", Set Values( lista ) ),
New Column("Numeric", Numeric, Set Values( lista )),
invisible
);
if( ColNMissing(Column(dt, "Character")) == ColNMissing(Column(dt, "Numeric")),
ret = as list(Column(dt, "Numeric") << get values),
ret = Expr(print("Non-Convertable"));
);
close(dt, no save);
ret;
回复:如何检查列表内容是否全部为数字而没有循环我发现检查导入的列是否实际上应该是数字的最简单方法是使用这行简单的代码,而实际上它是作为字符导入的。 它返回找到的数值的数量:
numberofnumerics = Col Number(num(<THE target="" column="">));</THE>
您还可以获得数字数量与非空白列数量的比率
ratio = Col Number(num(<THE target="" column="">)) / Col Number(<THE target="" column="">);</THE></THE>