Cercando di generare due colonne in base ad alcuni modelli di altre colonneCiao a tutti,
Sto cercando di generare due nuove colonne basate su modelli in altre due colonne ("Colonna richiesta 1" e "Colonna richiesta 2"). Si prega di vedere l'immagine allegata -

Qualche aiuto/suggerimento?
Grazie.
Ingegneria della qualità e dei processiRi: Cercando di generare due colonne in base ad alcuni modelli di altre colonneGrazie @jthi per la bella spiegazione.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonne1. Forse questa immagine spiega perché la prima idea non funziona (se ricordo bene la seconda soluzione si basa su quella se calcoli . +1 sarà . 

Ho preso i diversi confronti dall'istruzione If e ne ho semplicemente creato delle formule in modo che sia più facile vedere cosa restituisce True e quando.
Molto probabilmente potresti far funzionare la prima soluzione modificando leggermente i confronti ( Manca(:StartEnd) & Lag(:StartEnd) != "Fine" | :StartEnd == "Fine", val += 1 ). Ma con questa modifica dovrai apportare piccole modifiche anche al secondo confronto (aggiungi il controllo Row() != Col Max(Row())).
2. Idea per Riga() == Col Max(Riga()) & :StartEnd == "Inizio" è solo per verificare se siamo sull'ultima riga della tabella e il valore :StartEnd è "Start", non imposteremo il valore come 1 in base alla precedente istruzione if. Row() ti dirà il numero di riga e Col Max(Row()) ti restituirà il numero massimo di righe nel datatable. Potrebbe essere un controllo un po' inutile perché è l'ultima riga della tabella (come quella successiva con Inizio/Fine), ma poiché era nella colonna dei risultati, li ho implementati.
L'idea generale con l'ultimo if-else era la seguente:
1. Lag(:StartEnd) == "End" -> questo è lo "stop" generale dopo che End è stato contrastato
2. Row() == Col Max(Row()) & :StartEnd == "Start" -> per evitare di restituire 1 sull'ultima riga se è Start
3. :StartEnd == "Start" & Lag(:StartEnd, -1) == "End" -> per evitare di restituire 1 e 2 se non ci sono righe tra Start e End
Puoi usarne solo uno se con confronti multipli spostando leggermente alcuni confronti (questo sembrava restituire lo stesso risultato di 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 =.
)
Speriamo che la spiegazione non sia troppo confusa
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCiao a tutti,
Ho un'altra domanda, anzi due...
1. Qual è la differenza tra l'aggiunta di più di una condizione in una singola istruzione "If" e l'aggiunta di più di una condizione "If" con una singola condizione. Vedi l'immagine allegata - . Il primo caso non fornisce risultati corretti mentre il secondo funziona correttamente. I risultati possono essere visualizzati nei dati campione allegati. Ho difficoltà a capire le differenze qui.
A me sembra che per ogni riga: nel primo caso, se la condizione è vera, viene fornito l'output. Questo termina i risultati.
Mentre nel 2° caso, verranno eseguite tutte e 3 le istruzioni if in sequenza, indipendentemente dai risultati della precedente e l'output si baserà sull'ultima condizione vera. Non sono sicuro di essere in grado di spiegarlo correttamente. Ancora una volta, immagino che nel 2° caso (istruzione if multipla), ci sia una sorta di sovrascrittura sull'istruzione If precedente!

2. C'è una condizione utilizzata nella formula precedente -- " Row() == Col Max(Row()) & :StartEnd == "Start" " Come funziona? Funziona bene, significa che è ben scritto. Ma non riesco a visualizzare come si ferma la variabile/contatore "val"?
Qualche aiuto?
Grazie,
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCaro @jthi (Jarmo) e Caro @txnelson (Jim),
Sono davvero grato per il vostro sostegno e la vostra gentilezza.
Troverò sicuramente un modo funzionante con uno di questi due metodi e una combinazione di questi due.
Molte grazie ancora a entrambi.
Buon Natale e Felice Anno nuovo. Divertiti.
Distinti saluti,
Harry
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneHo provato con questo. Cerco di evitare di utilizzare Lag() quando possibile e di sostituirlo con le funzioni Col. La formula più difficile sembra essere Colonna obbligatoria 1 e non sono riuscito a trovare rapidamente una buona formula senza usare Lag() (molto probabilmente c'è una soluzione con Col Cumulative Sum in qualche modo). Un'idea potrebbe essere quella di riempire i posti tra Inizio e Fine con "In corso" o qualcosa di simile, quindi potresti forse usare Col Cumulative Sum più facilmente, ma poi la formula più difficile molto probabilmente si sposterebbe semplicemente in Inizio e fine .
Visualizza altro... Se hai tempo, suggerirei di testare entrambi i modi per risolverlo, quello @txnelson ha fornito un uso più intenso di Lag e confronti, e quello che ho con le formule Col. Entrambi hanno sicuramente i loro casi d'uso e comprenderli ti aiuterà a lungo termine quando scrivi formule/calcoli in JMP. E in alcuni casi, quando capisci come combinarli entrambi, puoi risolvere compiti piuttosto difficili solo con le formule.
Inoltre, dopo aver fatto funzionare la logica, molto probabilmente rimuoverei le formule dal datatable (o sostituirei Formula() con << Imposta ogni valore nello script), perché molto probabilmente si interromperà se l'ordine viene modificato in datatable.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneGrazie @txnelson ,
Ho fatto dei progressi e ho identificato correttamente il punto di inizio e di fine di ogni serie. Ho usato una logica molto semplice, puoi vedere nella colonna della formula.
Ma ora faccio fatica a inserire i numeri tra ciascuna coppia di punti "Inizio" e "Fine". Ho riscontrato problemi nel fermare il contatore alla "Fine". Il mio problema potrebbe avere la stessa complicazione, ma almeno ora ho cancellato il contrassegno/tag sul punto iniziale e finale.
Qualche aiuto con questo?
Grazie.

Grazie.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneIl problema sembra riguardare la logica applicata alla variabile JSL "altro".Non ho tempo per lavorare sulla questione oggi, ma domani pomeriggio dovrei essere in grado di fare qualche indagine.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCiao Jim,
Dispiace per la confusione.
La tua formula originale (credo di non averla incasinata) ha funzionato per la maggior parte dei casi, ma ha anche catturato alcuni punti sbagliati e ne ha persi alcuni sull'intero set di dati. Nel sottoinsieme di dati allegato (solo per un "ID" e un valore di "Sottoinsieme") c'è una colonna basata sulla formula che contiene pochi punti errati.
Righe: 647-649 voce errata (colore rosso)
Righe: 868-937 non catturate (colore rosso)
Righe: 1307-1311 voce errata (colore rosso)
E il problema è stato risolto quando ho inserito la condizione su :Occurrence.
Ora sto cercando -
1. Ultimo sensore primario presente = n (diciamo n = 2), contrassegnarlo come "Inizio"
2. Primo sensore primario in occorrenza = n+1 (= 3) e se non è presente alcun sensore primario per n = 3, dovrebbe arrestare/contrassegnare il valore in Occorrenza = n+2 == 4. Contrassegnalo come "Fine"
3. Infine inserisci i numeri tra "Inizio" e "Fine" in una nuova colonna.
Un modo alternativo di pensare a (potrebbe essere) --
Se possiamo contrassegnare - in ogni singola occorrenza n (n = 2) il primo sensore primario come FINE e l'ultimo sensore primario come Inizio e quindi inserire i valori tra Inizio e Fine in una nuova colonna.
Spero che questo possa aiutare e chiarire le cose.
Grazie,
Penso che questo possa essere, se riesco a trovare un file
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneio sono confuso.Da quello che posso vedere, lo script che ho scritto sembra funzionare, tranne per il fatto che dopo la riga 44 nella tabella dati hai modificato le regole e ora vuoi che End sia sulla riga prima del valore successivo di Primary.Qual è quello che vuoi?

Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCIAO @txnelson , Grazie per la risposta.
Non riesco a ottenere il punto di inizio corretto (requisito aggiornato). Nella tabella dati ("Dati campione aggiornati") e nell'immagine, avevo inserito manualmente le colonne di dati corrette.
La formula. Di solito ottenevo "Colonna richiesta 1 vecchia" e "Colonna richiesta 2 vecchia" è questa (è proprio come mi hai dato, ho aggiunto la condizione di occorrenza) -
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;

Grazie molto.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneHai modificato il codice che ho fornito in precedenza per ottenere i risultati forniti nella risposta più recente. Fornisci il JSL che stai utilizzando per ottenere i risultati visualizzati nella tabella dei dati di esempio.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCIAO @txnelson e tutto,
Sono stato in grado di modificare il tuo codice in base perfettamente alle mie esigenze. Ma nella seconda fase della risoluzione dei problemi ho bisogno di qualcosa del genere:
Segna :Sensore = "Primario" (1°) attorno al cambiamento consecutivo in :Occurrence.Nello screenshot fornito -
valori richiesti intermedi --- Ultimo "Primario" In Evento = 2 E Prima "Primaria" In Evento = 3 [cambiamento consecutivo nell'evento]
Trovare la prima primaria non è così difficile, non sai come trovare l'ultima primaria? Pensando di invertire in qualche modo (ordine discendente) i dati del sottoinsieme per Occurrence = 2, trova il valore e poi ripristinalo. Impossibile inserire una formula!! Qualche altro modo per farlo?
Qualsiasi aiuto?
Grazie.

Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneCIAO @txnelson ,
Ha quasi funzionato con poche voci false. Credo che dobbiamo aggiungere una condizione aggiuntiva nella colonna :Occurrence. Cioè :Occurrence deve cambiare per impostare :Required Column 2 == "Start" (e potrebbe essere un'opzione - dovrebbe essere lo stesso quando :Required Column 2 == "End").
Qualcosa come - Dif(:Occurrence) !=0 allora solo :Required Column 2 == "Start"
Per i miei dati di esempio (95 righe) andava bene con la tua formula, ma i miei dati effettivi che hanno più di 300.000 righe, forniscono molte voci errate come di seguito - (penso che dovrebbe andare bene una volta aggiunti i requisiti aggiuntivi su :Occurrence. ) Questo è solo uno screenshot della voce sbagliata.

Fiduciosamente!!Posso modificare la formula/codice e aggiungere il requisito di:Occurrence. sopra la tua formula.
Grazie ancora per il vostro sostegno.
Ri: Cercando di generare due colonne in base ad alcuni modelli di altre colonneEcco una formula per la colonna a cui fai riferimento alla Colonna richiesta 2.Quando studi il codice, vedrai che tutto ciò che fa è applicare le regole logiche che hai dichiarato che devono essere controllate quando si determinano i valori di Inizio e Fine.Contiene anche l'impostazione del valore per la colonna Colonna richiesta 1. Per eseguire questa formula, crea semplicemente la Colonna richiesta 1 e la Colonna richiesta 2. Imposta la Colonna richiesta 2 come colonna di caratteri.Quindi apri la formula per la Colonna richiesta 2 e copia la formula seguente nella colonna.

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;