Buscando generar dos columnas basadas en algún patrón de otras columnasHola a todos,
Estoy buscando generar dos columnas nuevas basadas en patrones en otras dos columnas ("Columna1 requerida" y "Columna2 requerida"). Por favor, vea la imagen adjunta -

¿Alguna ayuda/sugerencia?
Gracias.
Ingeniería de Calidad y ProcesosRe: Buscando generar dos columnas basadas en algún patrón de otras columnasGracias @jthi para una buena explicación.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnas1. Tal vez esta imagen explique por qué la primera idea no funciona (si no recuerdo mal, la segunda solución se basa en eso si calculas . + 1 será . 

Tomé las diferentes comparaciones de la declaración If y simplemente creé fórmulas a partir de ellas para que sea más fácil ver qué devuelve Verdadero y cuándo.
Lo más probable es que puedas hacer funcionar la primera solución modificando un poco las comparaciones ( Falta(:InicioFin) & Lag(:InicioFin) != "Fin" | :InicioFin == "Fin", val += 1 ). Pero con este cambio también tendrá que hacer pequeños cambios en la segunda comparación (agregue Fila()! = Col Max(Fila()) verificación).
2. Idea para Fila() == Col Max(Fila()) & :StartEnd == "Inicio" es solo para verificar si estamos en la última fila de la tabla y: el valor StartEnd es "Inicio". No estableceremos el valor como 1 según la declaración if anterior. Row() le indicará el número de fila y Col Max(Row()) le devolverá el número máximo de fila en la tabla de datos. Puede que sea una verificación un poco innecesaria porque es la última fila de la tabla (como la que sigue con Inicio/Fin), pero como estaba en la columna de resultados, las implementé.
La idea general con el último if-else fue la siguiente:
1. Lag(:StartEnd) == "Fin" -> esta es una "parada" general después de contrarrestar el fin
2. Row() == Col Max(Row()) & :StartEnd == "Inicio" -> para evitar devolver 1 en la última fila si es Inicio
3. :StartEnd == "Inicio" & Lag(:StartEnd, -1) == "Fin" -> para evitar devolver 1 y 2 si no hay filas entre Inicio y Fin
Puede usar solo uno si tiene múltiples comparaciones moviendo algunas de las comparaciones un poco (esto pareció arrojar el mismo resultado que Req1):
If(
Row() == 1, val = .,
Row() != Col Max(Row()) & :StartEnd == "Start" & Lag(:StartEnd, -1) != "End", val = 1,
Is Missing(:StartEnd) & Lag(:StartEnd) != "End" | :StartEnd == "End", val += 1,
val =.
)
Esperemos que la explicación no sea demasiado confusa.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHola a todos,
Tengo otra consulta, en realidad dos:
1. ¿Cuál es la diferencia si agrego más de una condición en una sola declaración "Si" versus agregar más de una declaración "Si" con una sola condición? Ver la imagen adjunta - . El primer caso no da resultados correctos mientras que el segundo funciona bien. Los resultados se pueden ver en los datos de muestra adjuntos. Tengo dificultades para entender las diferencias aquí.
A mí me parece que para cada fila; en el primer caso, si la condición es verdadera, se proporciona el resultado. Esto pone fin a los resultados.
Mientras que en el segundo caso, ejecutará las 3 declaraciones if secuencialmente, independientemente de los resultados de la anterior y la salida se basará en la última condición verdadera. No estoy seguro de poder explicarlo correctamente. Nuevamente, supongo que en el segundo caso (declaración if múltiple), hay una especie de sobrescritura en la declaración If anterior.

2. Hay una condición utilizada en la fórmula anterior: " Row() == Col Max(Row()) & :StartEnd == "Start" " ¿Cómo funciona? Funciona bien, significa que está bien escrito. ¿Pero no puedo visualizar cómo se detiene la variable/contador "val"?
¿Alguna ayuda con eso?
Gracias,
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasEstimado @jthi (Jarmo) y querido @txnelson (Jim),
Estoy realmente agradecido por su apoyo y amabilidad.
Seguramente encontraré una forma de trabajar mediante cualquiera de estos dos métodos y alguna combinación de estos dos.
Muchas gracias de nuevo a ambos.
Feliz navidad y próspero año nuevo. Disfruta tu tiempo.
Atentamente,
Harry
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasProbé esto. Intento evitar el uso de Lag() siempre que sea posible y reemplazarlo con funciones Col. La fórmula más difícil parece ser Columna 1 requerida y no pude encontrar rápidamente una buena fórmula sin usar Lag() (lo más probable es que haya una solución con Col Cumulative Sum de alguna manera). Una idea sería llenar los lugares entre Inicio y Fin con "En curso" o algo similar, entonces tal vez podrías usar Col Cumulative Sum más fácilmente, pero entonces la fórmula más difícil probablemente simplemente pasaría a Inicio y fin .
Ver más... Si tiene tiempo, sugeriría probar ambas formas de resolver esto, la que @txnelson ha proporcionado un uso más intensivo de Lag y comparaciones, y el que tengo con fórmulas Col. Definitivamente, ambos tienen sus casos de uso y comprenderlos lo ayudará a largo plazo al escribir fórmulas/cálculos en JMP. Y en algunos casos, cuando sabes cómo combinar ambos, puedes resolver tareas bastante difíciles solo con fórmulas.
Además, después de que la lógica funcione, lo más probable es que elimine las fórmulas de la tabla de datos (o reemplace la Fórmula() con << Establecer cada valor en el script), porque lo más probable es que esto se rompa si se cambia el orden en la tabla de datos.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasGracias @txnelson ,
Progresé un poco e identifiqué correctamente el punto inicial y final de cada serie. Utilicé una lógica muy simple, puedes ver en la columna de fórmula.
Pero ahora estoy luchando por poner números entre cada par de puntos "Inicio" y "Fin". Tengo problemas al detener el contador en "Fin". Mi problema puede tener la misma complicación, pero al menos ahora tengo una marca/etiqueta de limpieza en mi punto inicial y final.
¿Alguna ayuda con esto?
Gracias.

Gracias.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasEl problema parece estar relacionado con la lógica que se aplica a la variable JSL "otro".No tengo tiempo para trabajar en el tema hoy, pero mañana por la tarde debería poder investigar un poco.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHola Jim,
Perdón por la confusion.
Su fórmula original (creo que no la he estropeado) funcionó en la mayoría de los casos, pero también capturó algunos puntos incorrectos y omitió algunos en el conjunto completo de datos. En el subconjunto de datos adjunto (solo para un "ID" y un valor de "Subconjunto") hay una columna basada en su fórmula que tiene algunos puntos incorrectos.
Filas: 647-649 entrada incorrecta (color rojo)
Filas: 868-937 no capturadas (color rojo)
Filas: 1307-1311 entrada incorrecta (color rojo)
Y esto se solucionó cuando puse la condición: Ocurrencia.
Ahora estoy buscando -
1. Último sensor primario en aparición = n (digamos n = 2), márquelo como "Inicio"
2. Primer Sensor Primario en Ocurrencia = n+1 (= 3), y si no hay sensor primario para n = 3, se debe detener/marcar el valor en Ocurrencia = n+2 == 4. Márcalo como "Fin"
3. Y por último complete los números entre "Inicio" y "Fin" en una nueva columna.
Forma alternativa de pensar en (puede ser):
Si podemos marcar - en cualquier ocurrencia n (n = 2) el primer sensor primario como FIN y en el último sensor primario como Inicio y luego completar los valores entre Inicio y Fin en una nueva columna.
Espero que esto ayude y aclare las cosas.
Gracias,
Creo que esto puede ser, si puedo encontrar un
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasestoy confundido.Por lo que puedo ver, el script que escribí parece funcionar, excepto que después de la línea 44 en la tabla de datos, cambió las reglas y ahora desea que el Fin esté en la fila anterior al siguiente valor de Primario.¿Cuál es lo que quieres?

Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHola @txnelson , Gracias por su respuesta.
No puedo obtener el punto de inicio correcto (requisito actualizado). En la tabla de datos ("Datos de muestra actualizados") y la imagen, ingresé las columnas de datos corregidas manualmente.
La formula. Solía obtener "Columna requerida 1 antigua" y "Columna requerida 2 antigua" es esto (es tal como me lo dio, le agregué una condición de ocurrencia):
RCValue = "";
:Required Column 1[Row()] = .;
If( :Occurrence != Lag( Occurrence, -1 ),
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & :Occurrence == Lag( :Occurrence, -1 ) & Dif( :Occurrence ) == 0 &
withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Occurrence != Lag( Occurrence, -1 ) & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No"
& other == "Yes" & Row() != N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;

Muchas gracias.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHa modificado el código que proporcioné anteriormente para obtener los resultados que proporciona en su respuesta más reciente. Proporcione el JSL que está utilizando para obtener los resultados que muestra en su tabla de datos de muestra.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHola @txnelson y todo,
Pude modificar su código según mis necesidades. Pero en la segunda etapa de solución de problemas necesito algo como esto:
Marca :Sensor = "Primario" (primero) alrededor de un cambio consecutivo en :Ocurrencia.En la captura de pantalla dada -
valores requeridos en el medio --- Última "primaria" en Ocurrencia = 2 y Primera "primaria" en Ocurrencia = 3 [cambio consecutivo en Ocurrencia]
Encontrar la primera primaria no es tan difícil, ¿no estás seguro de cómo encontrar la última primaria? Pensando en invertir de alguna manera (orden descendente) los datos del subconjunto para Ocurrencia = 2, encuentre el valor y luego reviertalo. ¡¡No puedo poner una fórmula!! ¿Alguna otra forma de hacer eso?
¿Alguna ayuda?
Gracias.

Re: Buscando generar dos columnas basadas en algún patrón de otras columnasHola @txnelson ,
Casi funcionó con algunas entradas falsas. Creo que debemos agregar una condición adicional en la columna: Ocurrencia. Es decir: La ocurrencia debe cambiar para establecer: Columna 2 requerida == "Inicio" (y puede ser una opción; debería ser la misma cuando: Columna 2 requerida == "Fin").
Algo así como - Dif(:Ocurrencia) !=0 entonces solo :Columna 2 requerida == "Inicio"
Para mis datos de muestra (95 filas) estaba bien con su fórmula, pero mis datos reales, que tienen más de 300k filas, dan muchas entradas incorrectas como las que se muestran a continuación (creo que debería estar bien una vez que se agreguen requisitos adicionales sobre: Ocurrencia). ) Esta es solo una captura de pantalla de la entrada incorrecta.

¡¡Con un poco de suerte!!Puedo modificar la fórmula/código y puedo agregar el requisito de: Ocurrencia. encima de tu fórmula.
Gracias de nuevo por su apoyo.
Re: Buscando generar dos columnas basadas en algún patrón de otras columnasAquí hay una fórmula para la columna a la que hace referencia Columna obligatoria 2.Cuando estudie el código, verá que todo lo que hace es aplicar las reglas lógicas que usted ha indicado y que deben verificarse al determinar los valores de Inicio y Fin.También contiene la configuración del valor de la columna Columna requerida 1. Para ejecutar esta fórmula, simplemente cree la Columna requerida 1 y la Columna requerida 2. Configure la Columna requerida 2 para que sea una columna de caracteres.Luego abra la fórmula para la columna requerida 2 y copie la fórmula a continuación en la columna.

RCValue = "";
:Required Column 1[Row()] = .;
If( :Sensor != "Primary",
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Sensor == "Primary" & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No" & other == "Yes" & Row() !=
N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;