¡Convierta datos a numéricos, solo si es apropiado!Trabajo con datos almacenados en una tabla como parámetro y valor.Dado que el valor puede ser un carácter para algunos Parámetros, el tipo de datos en la base de datos es Carácter.Extraer los datos a JMP con un script SQL es fácil y dividir los datos por parámetro también es fácil.Pero ahora tengo una tabla de columnas donde me gustaría convertir algunas de las columnas a numéricas, pero otras no. Intenté esto pero, para mi sorpresa, JMP felizmente convirtió todas las columnas a números, descartando la información que era verdaderamente caracter.
Tcols = dt << Get Column Names(String);
For(i=2, i<=n items(Tcols), i++,
try(column(dt,i) << Data Type(Character);
column(dt,i) << Modeling Type("Nominal"));
);
¿Cómo puedo hacer una prueba para convertir solo columnas donde los datos son adecuadamente numéricos?
Re: ¡Convertir datos a numéricos, solo si es apropiado!Vicente,
Gracias por la información.Supongo que es algo complicado porque, dependiendo de la situación, algunos caracteres pueden tener diferentes significados (por ejemplo, "-" o "e").Su código funcionó tal como lo escribió, pero falló en mi conjunto debido a valores faltantes.Esos podrían manejarse con más argumentos en el comando Sustituir para encontrar y eliminar la cadena "", .
Analizar gramaticalmente ( Sustituto ( carbonizarse (valores), "\!"\!"\!, " , "" , "\!"" , "" , "{" , "[" , "}" , "]" ));
Sin embargo, toda mi Columna 2 son valores que podrían interpretarse como fechas, por lo que este código también los interpretó como tales.
names default to here(1);
dt = New Table( "Test",
Add Rows( 4 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values( {"A", "B", "C", "D"} )
),
New Column( "Column 2",
Character,
"Nominal",
Set Values( {"100-0001-01", "100-0001-01", "100-0001-01", "100-0001-01"} )
),
New Column( "Column 3",
Character,
"Nominal",
Set Selected,
Set Values( {"1", "2", "", "4"} )
)
);
dt = current data table();
for(i=1, i<=ncols(dt), i++,
col = Column(dt, i);
values = col << Get Values;
Try(
Parse(Substitute(char(values), "\!"\!"\!, ", "", "\!"", "", "{", "[", "}", "]"));
col << Data Type("Numeric") << Modeling Type("Continuous");
);
);
Aunque no es perfecto, puedo usar esto o el código de txnelson porque la columna que convierte como una fecha no es importante para mí.Si supiera que se está interpretando como una fecha, podría hacer una excepción.No tengo fechas en este conjunto de datos.
Palmadita
Re: ¡Convertir datos a numéricos, solo si es apropiado!Lo está tratando como una cita.
MDYHMS(num("100-0001-01"))
//returns
//"01/01/0100 00:00:00"
tal vez podría intentar analizar los caracteres en una matriz con comillas reemplazadas con cadenas vacías
names default to here(1);
dt = New Table( "Test",
Add Rows( 4 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values( {"A", "B", "C", "D"} )
),
New Column( "Column 2",
Character,
"Nominal",
Set Values( {"100-0001-01", "2", "4", "8"} )
),
New Column( "Column 3",
Character,
"Nominal",
Set Selected,
Set Values( {"1", "2", "3", "4"} )
)
);
for(i=1, i<=ncols(dt), i++,
col = Column(dt, i);
values = col << Get Values;
Try(
Parse(Substitute(char(values), "\!"", "", "{", "[", "}", "]"));
col << Data Type("Numeric") << Modeling Type("Continuous");
);
)Re: ¡Convertir datos a numéricos, solo si es apropiado!En su mayor parte funcionó, pero tras una inspección más detallada, hay un caso en el que suceden cosas extrañas.
Tengo algunos códigos que son números con guiones en ellos.Esperaría que se mantuvieran como personajes.
Pero esto es lo que hace JMP.
num("100-0001-01") da como resultado -56928614400
No sé cómo se le ocurre eso, pero como no falta, el código lo acepta como un número.
Re: ¡Convertir datos a numéricos, solo si es apropiado!Gracias. Esto funcionó.
Y copié en el código incorrecto arriba. Debería haber sido.
Tcols = dt << Get Column Names(String);
For(i=2, i<=n items(Tcols), i++,
try(column(dt,i) << Data Type(Numeric);
column(dt,i) << Modeling Type("Continuous"));
);Re: ¡Convertir datos a numéricos, solo si es apropiado!Aquí hay un ejemplo simple que prueba las primeras 10 filas de cada columna, y si no se encuentran valores no numéricos, convierte la columna en numérica
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// set all columns to character
For( i = 1, i <= N Cols( dt ), i++,
Column( i ) << set data type( character )
);
// Convert only numerics
For( i = 1, i <= N Cols( dt ), i++,
isNumeric = "NO";
For( theRow = 1, theRow <= 10, theRow++,
If( Column( i )[theRow] != "" & Is Missing( Num( Column( i )[theRow] ) ) == 1,
isNumeric = "NO";
Break();
,
isNumeric = "YES"
)
);
If( isNumeric == "YES",
Column( i ) << set data type( numeric )
);
);