Concatenar y suprimir fórmulasAmigos,
Tengo varias tablas (muestras) que tienen muchas fórmulas de columnas activas. Mi script en un punto, concatena todas las tablas. Sin embargo, quiero que se supriman las fórmulas, ya que quiero mantener intactos los datos de la tabla individual (muestra) para comparar/superponer todos los datos que se concatenaron. Desafortunadamente, parece que no puedo desactivar correctamente las fórmulas cuando se concatenan, y las columnas recién concatenadas se están evaluando, lo que pierde los datos de muestra individuales. Pensé que tenía este ritmo con el código adjunto, pero cuando volví a copiar la tabla inicial en otra carpeta, las fórmulas se "reactivaron" y causaron cierta frustración. Si hay una buena solución, estoy abierto a cualquier aporte, ya que la evaluación de la fórmula de supresión no funciona en la implementación actual.
neil
Con = Expr(
n = N Table();
dt = {};
// Sort list ascending (sample replicates)
For( i = 1, i <= n, i++,
table = data table(i);
insert into(dt, table);
sort list into(dt)
);
// Concatenate each file (sample replicates)
dt_all = Data Table( dt[1] );
For(i = 1, i <= n, i++,
If(i > 1,
Suppress Formula Eval(suppress=1);
dt_all << Concatenate(Invisible, dt[i], Append to first table);
)
);
Current Data Table(dt_all);
);
Acceso a los datosIngeniería de Calidad y ProcesosRe: Concatenar y suprimir fórmulasJarno,
Gran entrada. De hecho estaba empezando a mirar la ruta "Is Empty" anoche. Entonces, para finalizar la discusión para eliminar fórmulas y concatenar, tomé sus sugerencias y actualicé mi conjunto de habilidades codificando sus sugerencias. Además, según mi publicación y código originales, hice actualizaciones que también funcionaron.
- El primer bloque utiliza la instrucción "Está vacío" para seleccionar NO columnas de fórmula y simplemente eliminar las fórmulas del resto.
- El segundo bloque es usar "Probar", que no entendí completamente al principio cuando lo sugeriste incluso después de mirar el índice de secuencias de comandos. Pensé que la ejecución se detendría como los intentos anteriores, pero obviamente no.
- El tercer bloque usa "Suprimir fórmula eval" para la primera tabla abierta. Todas las demás tablas se concatenan en esta primera tabla, lo que también proporciona un resultado deseado en el que no se evalúan las columnas finales de la tabla concatenada.
No puedo agradecerles lo suficiente por todos sus aportes para ayudarme a mejorar mis habilidades.
neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
result = Column(file_1, CN[j]) << Get Formula;
y = Is Empty(result);
If(y==0, Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
Try(Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1 << Suppress Formula Eval(1);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Re: Concatenar y suprimir fórmulasSi no necesita necesariamente las fórmulas, ni siquiera necesita crearlas, ya que puede usar << Establecer cada valor en lugar de fórmula (o eliminar fórmulas inmediatamente después de la creación). Pero si los necesita, puede verificar si la columna tiene una fórmula con << obtener fórmula y si el resultado es Vacío(), entonces la fórmula no existe (use IsEmpty() para verificar la fórmula faltante) o podría "fuerza bruta " con Try-catch.
Obtener fórmula:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
result = col << Get Formula;
Show(result, IsEmpty(result));
col << Set Formula(:Height / :Weight);
col << Eval Formula;
result = col << Get Formula;
Show(result, IsEmpty(result));
Trata de atraparlo:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
Try(col << Delete formula, show(exception_msg)); //the show part isn't necessary
Luego, si desea recorrer las columnas que tienen fórmulas, puede recorrer la lista y crear una nueva (si tiene JMP16, use Filter Each).
También hay algunas publicaciones en la comunidad sobre cómo eliminar todas las fórmulas en la tabla, aquí hay una, por ejemplo: Buscar y eliminar todas las fórmulas presentes en una tabla
Re: Concatenar y suprimir fórmulasJarmo,
Muchas gracias por iluminar el tema. No me di cuenta de que habría un problema sin una fórmula existente. Con ese hecho en mente, creé una declaración condicional para la primera tabla. Obviamente, esto funcionó ya que "file_1" tiene la fórmula de columna específica eliminada una vez. El código adjunto funcionó para el ejemplo de una sola columna.
Ahora que se entiende que una fórmula debe estar presente, el problema es que todas las columnas no tienen fórmulas. Entonces, si recupero todos los nombres de las columnas, habrá un subconjunto que no tiene columnas asociadas. ¿Hay alguna manera de probar si una columna tiene una fórmula para que se pueda construir una lista adecuada para repetir? ¿O simplemente "forzo brutamente" el problema configurando una lista en JSL que tendré que actualizar cada vez que agregue una fórmula a una columna?
neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");
Re: Concatenar y suprimir fórmulas¿Está seguro de que está tratando de acceder a la tabla de datos correcta? Siempre está abriendo el mismo archivo que file_1 en el ciclo for.
Puede agregar algunas impresiones de depuración dentro del bucle para ayudarlo a descubrir cuál es el problema, como:
file_1 = Open(SD1 || b[1]);
show(file_1);
show(file_1 << Get Column Names("String")); //depending how many columns you have might not want to do this
show(Contains(file_1 << Get Column Names("String"), "Pore Diameter (um)"));
file_1:"Pore Diameter (um)" << delete formula;También recuerde cerrar las tablas de datos que ya no necesita con Close(dtref, no save);
Re: Concatenar y suprimir fórmulasLo siento por la respuesta tardía. Agradezco todos los comentarios.
Sin atacar todas las columnas todavía, solo intenté eliminar una fórmula en una columna en particular. Cuando aplico la línea "eliminar fórmula" fuera del bucle, obtengo el resultado deseado, es decir, no existe ninguna fórmula. Sin embargo, si la misma línea va dentro del bucle, después de abrir el archivo, aparece el siguiente error:
"El diámetro de poro de la columna (um) no tiene fórmula en el acceso o evaluación de 'eliminar fórmula', eliminar fórmula/*###*/"
Obviamente, todavía no tengo la comprensión mecánica para ver por qué hay un problema. ¿Serías capaz de proporcionar alguna idea?
Muchas gracias.
For( i=1, i <= N Items(b), i++,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, Append to first table);
);
);
//file_1:"Pore Diameter (um)" << delete formula;
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Re: Concatenar y suprimir fórmulasJMP también puede hacer esto de forma interactiva con los atributos estandarizados:
Seleccione todas las columnas, haga clic con el botón derecho en una de las columnas y seleccione Estandarizar atributos:

Agregue fórmula para eliminar propiedades y presione Aceptar (o aplicar):

Si tiene JMP16, esto se imprimirá en el registro mejorado:
// Open Data Table: Wheat.jmp
// → Data Table("Wheat")
Open("$SAMPLE_DATA/Wheat.jmp");
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Wheat"));
For Each({col, index},
{:Variety, :Yield, :Moisture, :Pred Formula Yield, :Cond Pred Formula Yield},
col << Delete Formula
);
Current Data Table(old dt);
);
Y esto le dará una buena idea de cómo manejar esto (lo mismo que dijo txnelson, recorra la lista y elimine fórmulas a medida que avanza). También puede obtener todas las columnas de la tabla con << Obtener nombres de columna. No podrá eliminar fórmulas de las columnas que no las tienen (y el script proporcionado por el registro mejorado no funcionará directamente de esa manera), pero puede evitarlo envolviendo la columna << Eliminar fórmula con Try(). Después de limpiar el script de registro mejorado, podría terminar con algo como esto:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Wheat.jmp");
For Each({col}, dt << get column names(String),
Try(Column(dt, col) << Delete Formula)
);Re: Concatenar y suprimir fórmulasPuede poner los nombres de las columnas en una lista y luego recorrer la lista, eliminando cada uno.
Re: Concatenar y suprimir fórmulasJim,
Gracias por la respuesta. Dado que hay alrededor de 10 columnas con fórmulas por tabla, ¿hay un enfoque "general" para eliminar todo a la vez?
neil
Re: Concatenar y suprimir fórmulasLo que debe hacer es eliminar las fórmulas antes de la concatenación.Eso convertirá los valores a valores estáticos y luego no tendrá ningún problema.
:yourColumn << delete formula;