Actualizar columna en filas especificadas<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Intento utilizar los comandos de script "Para cada fila" y "Comenzar actualización de datos" para actualizar el cálculo en una fila específica relacionada con una columna.
De acuerdo con la siguiente tabla, pretendo tener dos columnas de suma, Tasa de defectos (%) y Rendimiento, y ambas usan la misma ecuación de cantidad de celdas/total diario.
Sin embargo, la columna Tasa de defectos (%) solo calculará las filas donde Categoría = Rechazado y MRB, y la columna Rendimiento solo calculará las filas donde Categoría = Agrupados.
Puedo hacer este trabajo usando el comando IF como
dt=Tabla de datos actual();
dt<< Nueva columna("Tasa de defectos(%)", Numérico, "Continuo", Fórmula(Nombre Expr(If(:Categoría == "Rechazar", "MRB",:Cantidad de celda/:Total diario)))) ;
Sin embargo, trato de aprender a usar Para cada fila combinado con Iniciar actualización de datos para llegar al mismo resultado.
dt<< Nueva columna("Rendimiento", Numérico, "Continuo");
<< Iniciar actualización de datos;
Para cada fila( :Rendimiento_ = Seleccionado(Estado de la fila())=Contiene(:Categoría,"Binned"), :Cantidad de celdas/:Total diario)
¿Alguien puede ayudar?
Gracias,
Categoría | Semana de trabajo | Fecha_PROD. | Cantidad de celdas | Total diario | Tasa de defectos(%) | Producir |
| Rechazar | 25 | 2016-06-20 | 751 | 15553 | | |
| MRB | 25 | 2016-06-20 | 21 | 15553 | 0.00135022 | |
| en la papelera | 25 | 2016-06-20 | 14781 | 15553 | 0.95036327 | 0.95036327 |
| Rechazar | 25 | 2016-06-21 | 1251 | 31586 | | |
| MRB | 25 | 2016-06-21 | 83 | 31586 | 0.00262775 | |
| en la papelera | 25 | 2016-06-21 | 30252 | 31586 | 0.9577661 | 0.9577661 |
| Rechazar | 25 | 2016-06-22 | 1276 | 27964 | | |
| MRB | 25 | 2016-06-22 | 42 | 27964 | 0.00150193 | |
| en la papelera | 25 | 2016-06-22 | 26646 | 27964 | 0.95286797 | 0.95286797 |
| Rechazar | 25 | 2016-06-23 | 126 | 1786 | | |
| MRB | 25 | 2016-06-23 | 5 | 1786 | 0.00279955 | |
| en la papelera | 25 | 2016-06-23 | 1655 | 1786 | 0.92665174 | 0.92665174 |
Re: Actualizar columna en filas especificadasHola bernie426,
Según mi experiencia personal, el comando IF completa sus operaciones muy rápidamente y le devolverá resultados instantáneos porque solo se ocupa de una situación de sí o no. Por otro lado, verá un retraso notable antes de generar completamente los resultados a través del bucle, ya que los comandos de bucle tienen que lidiar con iteraciones y seguirán funcionando hasta que alcancen la última iteración definida por el programador.
Estas declaraciones solo se aplican si se trata de un conjunto de datos enorme que involucra una cantidad significativamente grande de filas y columnas, lo que hace que el comando IF sea una opción más superior que los comandos en bucle en términos de consumo de tiempo. Sin embargo, para conjuntos de datos más pequeños, es seguro utilizar cualquiera de los comandos, ya que el retraso de tiempo para completar los resultados es insignificante.
Atentamente,
vale
Re: Actualizar columna en filas especificadasHola Val,
Gracias por las soluciones sugeridas, ambas funcionan bien.
En realidad, se me ocurrió otro enfoque de fórmula usando el comando IF como
dt=Tabla de datos actual();
dt<< Nueva columna("Tasa de defectos(%)", Numérico, "Continuo", Fórmula(Nombre Expr(If((contiene(:Categoría, "MRB")| contiene(:Categoría, "Rechazar")),: Cantidad de celdas/:Total diario))));
dt<< Nueva columna("Rendimiento", Numérico, "Continuo", Fórmula(Nombre Expr(If(:Categoría == "Binned",:Cantidad de celdas/:Total diario))));
¿Sabe cuál es la diferencia de velocidad en blanco y negro usando el comando IF y el comando de bucle?
Muchas gracias,
Re: Actualizar columna en filas especificadasHola,
Según el resultado esperado en su pregunta, creo que hay un pequeño error en su fórmula para " Tasa de defectos(%) " si solo desea que se ignoren las filas "Rechazadas" de la columna "Categoría".
Nunca intenté usar Para cada fila o Comience la actualización de datos antes, por lo que no estoy seguro de cómo corregir sus códigos actuales usando esos comandos. Sin embargo Tengo 2 enfoques alternativos sobre cómo se puede lograr el mismo resultado.
1) Usando el comando IF (enfoque más rápido):
dt=Tabla de datos actual();
a = (dt<< Nueva columna("DR", "Continuo", Fórmula(If(:Categoría == "Rechazar", "", Char(:Cantidad de celdas /:Total diario)))))<
dt << Nueva columna ("Tasa de defectos (%)", "Continuo", establecer valores (a));
b = (dt<< Nueva columna("Y", "Continua", Fórmula(If(:Categoría == "Binned", Char(:Cantidad de celdas /:Total diario), ""))))<
dt << Nueva columna ("Rendimiento", "Continuo", establecer valores (b));
dt<
Dado que algunas columnas deben devolverse como columnas vacías (""), las columnas creadas se configurarán automáticamente como columnas de caracteres aunque ya las haya definido como numéricas cuando las creó. Por lo tanto, he creado columnas ficticias adicionales para fines de cálculo y establecí estos valores en nuevas columnas (" Tasa de defectos(%) " y " Rendimiento") que desea crear. De esta forma, obtendrás columnas numéricas.
2) Usando los bucles Obtener filas donde() y FOR:
dt=Tabla de datos actual();
dt << Nueva columna("Tasa de defectos(%)", "Continua", numérica);
r1 = dt << obtener filas donde(:Categoría!="Rechazar");
para (i=1, i<=nrows(r1), i++,
Columna(dt, "Tasa de defectos(%)")[r1 ] = :Cantidad de celdas[r1 ] / :Total diario[r1 ]
);
dt << Nueva columna("Rendimiento", "Continuo", numérico);
r2 = dt << obtener filas donde(:Categoría=="Binned");
para (i=1, i<=nrows(r2), i++,
Columna(dt, "Rendimiento")[r2 ] = :Cantidad de celdas[r2 ] / :Total diario[r2 ]
);
Creo que este enfoque será más lento si su conjunto de datos es enorme, ya que el bucle requiere más tiempo de procesamiento.
Salida final:

¡Espero que esto ayude!
Atentamente,
vale