So überprüfen Sie, ob der Inhalt einer Liste ohne Schleifen nur numerisch istHallo,
Ich schreibe einen Code, der Daten importiert, und ich möchte einige Daten ähnlich wie MessyTables für Python überprüfen.
Daten können versehentlich als Zeichen importiert werden, da „NULL“ oder ähnliches in den Daten vorhanden ist. Nachdem ich die häufigen Instanzen davon entfernt habe, möchte ich die Daten erneut überprüfen, um zu sehen, ob sie numerisch sind.
Der einfachste Weg, dies zu tun, besteht darin, Try() und Matrix() zu verwenden, nachdem Sie alle "" um Elemente in der Liste entfernt haben.
Ich könnte die columnKeys durchlaufen und wenn die Num()-Konvertierung fehlschlägt, einen Throw() auslösen, wäre dies verschwenderisch, wenn die Tabelle lang ist und die Spalte viele eindeutige Zahlen enthält.
Der folgende Code schreibt einen Fehler in long, was in Ordnung ist. Es löst jedoch auch ein JMP-Warnfenster aus, sobald ich es in mein Add-In integriere, aber nicht, wenn ich es direkt ausführe.
Irgendwelche Vorschläge für Alternativen, um zu überprüfen, ob eine Liste numerisch ist, oder um den JMP-Alarmdialog zu unterdrücken?
Danke,
Stefan
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);
);Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste nur numerisch ist, ohne Schleifen?Danke schön! Ich habe stundenlang nach so etwas gesucht.Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?Wahrscheinlich sollten alle fehlenden Werte aus der Liste entfernt werden, da dies ebenfalls Probleme verursachen wird.
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 );Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Craige@JMP Danke, das hat wunderbar funktioniert und ich bin mir sicher, dass ich es wieder mit anderen Try-Anweisungen verwenden werde.
Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?Um den Dialog schließlich zu unterdrücken, verwenden Sie die BatchInteractive-Funktion.Beachten Sie, dass es zwei Aufrufe gibt, einen davor und einen danach.Wenn Sie JMP im BatchInteractive(1)-Zustand laufen lassen, wird es Ihnen schwer fallen, JMP zu schließen.
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 );
Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?und um die Logmeldungen zu unterdrücken:
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 );
Betreff: Wie umgeht man den Fehler parse("a+b)")? besprochen logcapture und versuchen.
edit: überflüssige Zuweisung zum Ergebnis entfernt.
Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?Hier ist eine Variation Ihrer ursprünglichen Idee:
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");
Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste nur numerisch ist, ohne Schleifen?Das scheint ziemlich schnell. Es verwendet nur die JMPs-Funktion (?), Wo es nur nicht numerische Werte in fehlende Werte umwandelt, wenn die Spalte numerisch angegeben ist.
*Bearbeiten für Geschwindigkeit*
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;
Betreff: Wie kann man überprüfen, ob der Inhalt einer Liste ohne Schleifen numerisch ist?Ich finde den einfachsten Weg, um zu überprüfen, ob eine importierte Spalte tatsächlich numerisch sein sollte, wenn sie tatsächlich als Zeichen importiert wurde, indem ich diese einfache Codezeile verwende. Es gibt die Anzahl der gefundenen numerischen Werte zurück:
numberofnumerics = Col Number(num(<THE target="" column="">));</THE>
Sie können auch ein Verhältnis der Anzahl der Zahlen zur Anzahl der nicht leeren Spalten erhalten
ratio = Col Number(num(<THE target="" column="">)) / Col Number(<THE target="" column="">);</THE></THE>