El bucle For no funciona según lo previstoHola,
Tengo 2 problemas muy desconcertantes.
1) Para el bucle for simple a continuación, tengo 3 condiciones que se cumplen para una sola salida. Verifiqué mirando manualmente y graficando que las 8 combinaciones están efectivamente presentes en los datos. Sin embargo, esto resulta desequilibrado, donde solo x1, x2 y x3 llenarán todas las celdas de la columna X1. La entrada x2, por ejemplo, tendrá el doble de entradas asignadas. Tras una inspección adicional a través del subconjunto, las columnas A1, B1 y C1 se cumplen tanto para x2 como para x4, lo que estaría en partes iguales. Todas las columnas comparten los mismos datos y tipo de modelado.
También bloqueé la entrada que está reuniendo el doble de entradas, solo para ver qué pasa. Luego las entradas se agrupan, por ejemplo, en x2.
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2";
);
);
2) Si acorto el código asignando valores a la celda con &, aparece el error "intento de asignar a un objeto que no es un valor L". Este es un intento de acortar mi código y no tener múltiples bucles diferentes. A continuación se muestra un ejemplo de 3 criterios y 3 resultados.
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
);
);
Se agradecería cualquier orientación. ¡Gracias por tu ayuda de antemano!
Ingeniería de Calidad y ProcesosRe: El bucle for no funciona según lo previstoTambién me aseguré de que los nombres de las columnas se llamen correctamente en el código y probé tanto las comas como los puntos y comas al final de una línea. He dividido el código en partes más pequeñas, separando los posibles valores en la columna A1 en diferentes bucles for, pero tengo el mismo problema.
Re: El bucle for no funciona como se esperabaHola @carambolabob ,
Estás cerca...
La sintaxis de un si funcion es If (condición 1, resultado 1, condición 2, resultado 2, sino resultado).
Así que reelabore su declaración reemplazando el punto y coma final con una coma:
For( i = 1, i <= N Rows ( dt ), i++,
If(
// condition 1 = :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1"
// result 1 = :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
);
);
HH.
salud,
Stan
Re: El bucle for no funciona como se esperabaHola Stan,
¡Gracias por su rápida respuesta!Esto es algo con lo que ya he experimentado y en lugar de completar x1, x2 y x3, se completarán x1, x2 y x4, por ejemplo.
Esto también sucede con múltiples salidas, como la columna X1 e Y1.
Re: El bucle for no funciona según lo previstoSí, asegúrate de usar las comas como sugiere Stan. si los secretos
Editar: creo que quieres
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x2" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x2" ,
throw("Nothing matched!") // this is the otherwise case
);
Si realmente quiere varias asignaciones, use ; más bien que &
:X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2" // change this
:X1[i] = "x1"; :Y1[i] = "y1"; :Z1[i] = "z2"; // to this
Si bien podría funcionar con &, será muy frágil y muy difícil de descifrar para la próxima persona. Como dices, el compilador ve
a=1 & b=2
como
a = ( ( 1 & b ) = 2 )
que produce el mensaje de valor L. Sería bueno si el mensaje de error no fuera el lenguaje del programador. No puedo almacenar el valor 2 del lado derecho de = en "1 & b" en el lado izquierdo de = porque "1 & b" no es un nombre de variable .
En realidad, el compilador hace un trabajo razonablemente bueno para a=1 & b=2:
intentando asignar a un objeto que no es un valor L en el acceso o evaluación de 'Assign', 1 & b = /*###*/2 /*###*/
Re: El bucle for no funciona como se esperabaEste fue literalmente mi segundo intento de todo esto, y volví a hacerlo durante el fin de semana y funcionó.No tengo una explicación de por qué no funcionó la primera vez que lo probé así.¡Gracias por su respuesta!