Después de horas de búsqueda en Internet, no parece haber una respuesta clara sobre cómo realizar lo que quiero hacer y, después de varios intentos de codificación, esta es claramente una de esas áreas en las que JSL difiere dramáticamente de otros lenguajes de programación. Tengo archivos CSV que se utilizan como bases de datos en un programa VBA personalizado para un cliente. La razón para usar archivos CSV se debió en gran parte a que era fácil importar la base de datos a JMP para realizar análisis periódicos sin tener que crear una función de exportación especializada, ya que la versión anterior de la herramienta personalizada era necesaria. Estoy creando una secuencia de comandos para importar el archivo de base de datos y realizar una preparación preliminar para que la tabla de datos tenga todo en su lugar para que se puedan realizar análisis de rendimiento. La mayor parte de esto es bastante rutinario y se ha logrado en mi script JSL hasta ahora.
El problema que tengo ahora es que tengo valores cero en varios lugares que realmente deberían faltar valores. Los ceros resultaron de la exportación de los datos de Excel utilizando un objeto de datos en VBA. Los datos en el archivo de la base de datos nunca están en una hoja de cálculo, ya que la herramienta personalizada de Excel está completamente basada en GUI, por lo que los datos que faltan en realidad tienen un valor predeterminado de 0 en las propiedades que conforman el objeto de datos en el código; VBA no tiene equivalente de datos faltantes para tipos de datos numéricos.
Por lo tanto, lo que quiero hacer es reemplazar los ceros en columnas específicas a valores perdidos basados en banderas en otras columnas. Por ejemplo, si la columna "Datos de lecturas canceladas" tiene 'Falso' en una fila dada, entonces todas las columnas asociadas con una encuesta de lecturas canceladas para esa fila deben tener valores faltantes, ya que no se realizó una encuesta de lecturas canceladas para esa información en particular. grabar. De manera similar, si el valor de la columna "Encuesta cancelada" es 'Verdadero', todas las columnas de datos de la encuesta en esa fila deben contener valores faltantes, ya que no se realizó ninguna encuesta de ningún tipo para ese registro. Con los ceros en su lugar, se distorsionarán varias estadísticas porque JMP incluirá registros en el análisis que deben ignorarse.
He intentado dos métodos diferentes en vano. El primero fue usar una condición y recorrer en bucle las columnas:
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);Parte del problema aquí parece ser que las referencias de columna (vehiclePackageColumn y expiredReadsColumn) no son números de columna porque el uso de vehiclePackageColumn = Column ("Paquetes de vehículos") no devuelve el número de columna para la columna "Paquetes de vehículos". De hecho, no pude encontrar ninguna información sobre cómo capturar el índice de columna (número) para las columnas que usan JSL.
El segundo método se basó en algo que vi en otro foro:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
Cualquier ayuda con esto sería muy apreciada.
Lo intenté. Funciona genial. Gracias de nuevo, JIm.
Esta es una fácil:
colnames = dt << obtener nombres de columna (cadena);
startindex = contiene (colnames, "El nombre de su columna inicial");
endindex = contiene (colnames, "El nombre de su columna final");
¡Sí!
Eso pareció resolver el problema principal de obtener valores perdidos en un rango de columnas basado en el estado de las banderas en columnas específicas, Jim. Entonces, el único problema reminente es si hay una manera de capturar índices de columna. Mi tabla de datos es bastante grande y tener que contar las columnas como lo hice en mi prueba del código sugerido es tedioso y propenso a errores; Esta tabla de datos en particular tiene 73 columnas. Falta de un medio para determinar el número de columnas de las columnas nombradas en JSL es una omisión grave, aunque solo sea para operaciones como esta.
Pensaría que esto funcionaría:
dt = tabla de datos actual ();
Para (i = su número de col inicial, i <= su número de col final, i ++,
columna (dt, i) [dt << obtener filas donde (: Datos de lecturas canceladas == "Verdadero")] =.
);