Cómo verificar si el contenido de una lista es todo numérico sin buclesHola,
Estoy escribiendo un código que importa datos y me gustaría hacer una verificación de datos similar a MessyTables para python.
Los datos pueden importarse accidentalmente como carácter debido a que "NULL" o similar está presente en los datos. Después de eliminar las instancias comunes de estos, me gustaría verificar los datos nuevamente para ver si son numéricos.
La forma más fácil de hacer esto es usar Try() y Matrix() después de eliminar cualquier "" alrededor de los elementos de la lista.
Podría recorrer las columnKeys y si la conversión de Num() falla, desencadenar un Throw(), esto sería un desperdicio si la tabla es larga y la columna tiene muchos números únicos.
El siguiente código escribe un error en el largo, lo cual está bien. Sin embargo, también activa una ventana de Alerta JMP una vez que la incorporo a mi complemento, pero no si la ejecuto directamente.
¿Alguna sugerencia de alternativas para verificar si una lista es numérica o para suprimir el cuadro de diálogo Alerta JMP?
Gracias,
Esteban
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: Cómo comprobar si el contenido de una lista es todo numérico sin bucles¡Gracias! He estado buscando algo como esto durante horas.Re: Cómo comprobar si el contenido de una lista es todo numérico sin buclesProbablemente debería eliminar los valores faltantes de la lista, ya que eso también causará problemas.
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: Cómo comprobar si el contenido de una lista es todo numérico sin bucles<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Craige@JMP Gracias, funcionó de maravilla y estoy seguro de que es algo que usaré nuevamente con otras declaraciones de prueba.
Re: Cómo comprobar si el contenido de una lista es todo numérico sin buclesFinalmente, para suprimir el cuadro de diálogo, use la función BatchInteractive.Observe que hay dos llamadas, una antes y otra después.Si deja que JMP se ejecute en el estado BatchInteractive(1), tendrá dificultades para cerrar 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: Cómo comprobar si el contenido de una lista es todo numérico sin buclesy para suprimir los mensajes de 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: ¿Cómo omitir el error de análisis ("a+b)")? discutido logcapture y try.
editar: se eliminó la asignación redundante al resultado.
Re: Cómo comprobar si el contenido de una lista es todo numérico sin buclesAquí hay una variación de su idea original:
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: Cómo comprobar si el contenido de una lista es todo numérico sin buclesEsto parece bastante rápido. Simplemente usa la función JMP (?) Donde simplemente convierte los valores no numéricos en valores faltantes si la columna se especifica como numérica.
*Editar por velocidad*
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: Cómo comprobar si el contenido de una lista es todo numérico sin buclesEncuentro que la forma más fácil de verificar si una columna importada debería ser realmente numérica, cuando de hecho se importó como carácter es usar esta línea de código simple. Devuelve el número de valores numéricos encontrados:
numberofnumerics = Col Number(num(<THE target="" column="">));</THE>
también puede obtener una relación entre la cantidad de números y la cantidad de columnas que no están en blanco
ratio = Col Number(num(<THE target="" column="">)) / Col Number(<THE target="" column="">);</THE></THE>