¿Hay alguna manera de reevaluar automáticamente el tipo de datos?Si tengo una tabla de datos que divido en diferentes columnas, todas las columnas aparecen con un tipo de datos de "Carácter" como se esperaba.
Ahora, ¿hay alguna manera de que podamos escribir un script JSL para volver a evaluar automáticamente si el tipo de datos debe ser numérico o de caracteres? Si encuentra que la entrada de datos son números, ¿cambiar el tipo de datos a numérico?
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Un enfoque sería contar la cantidad de valores faltantes, tomar una lista de los valores, forzar la columna a ser numérica y luego contar la cantidad de valores faltantes nuevamente. Si el número de faltantes es el mismo antes y después, tiene una columna numérica. De lo contrario, vuelva a cambiarlo y reemplace los valores con la copia.
Donde esto fallaría es cuando aparece un valor no numérico, como NA, en una columna numérica.
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Don me ganó en una solución, pero otra opción sería usar una expresión regular para determinar si cada columna contiene solo caracteres de número y punto (punto decimal). El siguiente ejemplo toma cada columna, concatena todos sus valores en una cadena grande y luego verifica si esa cadena contiene algún carácter que no sea un número o un punto decimal ([^0-9\.] ). Si encuentra solo números y puntos decimales en toda la columna (es decir, Contiene elemento se evalúa como cero), establece el tipo de datos en numérico.
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Si no necesita una solución automatizada, hay una opción de triángulo rojo Analizar como números en Recodificar. Cambia cualquier entrada no numérica (como NA) a un valor faltante.
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Un problema potencial con este enfoque es que no es compatible con la notación científica. Modificar Regex para aceptar notación científica y negativos, mientras se rechazan cosas como teléfonos y números de seguro social, lo hace significativamente (¡ja! juego de palabras!) más complejo.
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Este es el enfoque que recomiendo. Dependiendo de los datos que probablemente se encuentren, también he hecho lo siguiente:
1) Use solo las primeras k filas de cada columna para tomar la decisión, para aumentar la eficiencia.
2) Permitir algún porcentaje (modificar según sea necesario) de faltantes en una columna dada (o su subconjunto). Por debajo de este umbral, convierta a numérico de todos modos.
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Junto con las complicaciones ya mencionadas, tener la solución también considera las comas como separadores de decimales o como separadores numéricos para 1000. De esa manera, también podría ser una solución más internacional.
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Buen punto (y juego de palabras), Brady. Esta solución de expresiones regulares funciona para los datos de ejemplo de buen comportamiento, pero no se generalizaría a todos los datos posibles. Me imagino que hay una expresión regular maestra que podría hacer el trabajo, pero podría ser una tarea difícil encontrarla. Alternativamente, uno podría recorrer cada fila individual en una columna con una o más comprobaciones de Contiene elementos más simples; por ejemplo, uno podría permitir un guión inicial (para números negativos) pero rechazar todo lo que contenga guiones que no sean iniciales, luego otro podría verificar si la fila se ajusta a la notación científica. Si se aprueban todas las comprobaciones para todas las filas de una columna, cambie el tipo de datos. Como dices, "significativamente" más complejo.
Re: ¿hay alguna forma de reevaluar automáticamente el tipo de datos?Llegué un poco tarde a la fiesta, pero una forma "tramposa" es exportar el archivo como csv y luego volver a importarlo, donde JMP determinará automáticamente los tipos de columna al abrir. Sin embargo, esto supone que no necesita guardar ningún script de tabla o propiedades de columna. Aquí hay un guión.
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");