Come verificare se il contenuto di un elenco è tutto numerico senza loopCiao,
Sto scrivendo del codice che importa i dati e vorrei eseguire un controllo dei dati simile a MessyTables per Python.
I dati possono essere importati accidentalmente come carattere a causa della presenza di "NULL" o simili nei dati. Dopo aver rimosso le istanze comuni di questi, vorrei controllare di nuovo i dati per vedere se sono numerici.
Il modo più semplice per farlo è usare Try() e Matrix() dopo aver rimosso qualsiasi "" attorno agli elementi nell'elenco.
Potrei scorrere i columnKeys e se la conversione Num() fallisce, attiva un Throw(), questo sarebbe uno spreco se la tabella è lunga e la colonna ha molti numeri univoci.
Il codice seguente scrive un errore sul long, il che va bene. Tuttavia, attiva anche una finestra di avviso JMP una volta che lo incorporo nel mio componente aggiuntivo, ma non se lo eseguo direttamente.
Qualche suggerimento su alternative per verificare se un elenco è numerico o per sopprimere la finestra di dialogo Avviso JMP?
Grazie,
Stefano
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);
);Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopGrazie! Ho cercato qc come questo per ore.Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopProbabilmente dovrebbe rimuovere tutti i valori mancanti dall'elenco poiché anche ciò causerà problemi.
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 );Re: Come verificare se il contenuto di un elenco è tutto numerico senza loop<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Craige@JMP Grazie, ha funzionato benissimo e sono sicuro che sarà qualcosa che userò di nuovo con altre affermazioni try.
Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopInfine, per sopprimere la finestra di dialogo, utilizzare la funzione BatchInteractive.Notare che ci sono due chiamate, una prima e una dopo.Se si lascia JMP in esecuzione nello stato BatchInteractive(1), sarà difficile chiudere 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 );
Re: Come verificare se il contenuto di un elenco è tutto numerico senza loope per sopprimere i messaggi di registro:
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 );
Re: come bypassare l'errore parse("a+b)")? discusso logcapture e provare.
modifica: rimossa l'assegnazione ridondante al risultato.
Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopEcco una variazione sulla tua idea originale:
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");
Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopQuesto sembra abbastanza veloce. Utilizza semplicemente la funzione JMPs (?) dove trasforma semplicemente i valori non numerici in valori mancanti se la colonna è specificata numerica.
*Modifica per velocità*
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;
Re: Come verificare se il contenuto di un elenco è tutto numerico senza loopTrovo il modo più semplice per verificare se una colonna importata dovrebbe essere effettivamente numerica, quando in realtà è stata importata come carattere è usare questa semplice riga di codice. Restituisce il numero di valori numerici trovati:
numberofnumerics = Col Number(num(<THE target="" column="">));</THE>
puoi anche ottenere un rapporto tra il numero di numeri e il numero di colonne non vuote
ratio = Col Number(num(<THE target="" column="">)) / Col Number(<THE target="" column="">);</THE></THE>