Come utilizzare la funzione Dif/Lag per gruppo di colonne<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salve gente della community di JMP,
Ho una tabella di dati con quattro colonne come Box, iClass, BinPos e Slot.iClass significa 24 livelli di prodotti, BinPos indica la posizione della scatola nell'apparecchiatura di smistamento e Slot indica in quale posizione dello slot il prodotto deve essere inserito nella scatola. La scatola è progettata per contenere una quantità massima di 100 prodotti, dopodiché verrà inserita una nuova scatola vuota. Per verificare che il prodotto sia posizionato nella casella giusta e che l'incremento dello slot sia esattamente di "1" (poiché a volte ho osservato manualmente l'incremento dell'incremento dello slot > 1 o increment = 0, il che significa che la macchina di posizionamento ha problemi), ho provato a utilizzare la funzione dif/lag per controllare l'incremento. Tuttavia, la formula dif/lag non mi consente di aggiungere una funzione al raggruppamento per colonna di Box. The Box è in realtà l'identificatore univoco.
Una formula come Dif(:Slot,1) può dirmi la differenza b/wa certa rispetto alla riga precedente. Tuttavia, le righe sono mescolate con diversi Box a causa della differenza di livello del prodotto che appartiene alla colonna iClass.
Spero di avere una formula come Dif(:Slot, 1, :Box) per funzionare. Qualche esperto può fornire qualche indizio per risolverlo? Una tabella di esempio è allegata per l'indagine.
Molte grazie in anticipo
| Scatola | iClass | BinPos | Fessura |
| 72813_2 | 11 | 11 | 64 |
| 73213_2 | 15 | 15 | 2 |
| 73213_2 | 15 | 15 | 3 |
| 73213_2 | 15 | 15 | 4 |
| 73213_2 | 15 | 15 | 5 |
| 73213_2 | 15 | 15 | 6 |
| 73213_2 | 15 | 15 | 7 |
| 73213_2 | 15 | 15 | 8 |
| 73214_2 | 14 | 14 | 1 |
| 73214_2 | 14 | 14 | 2 |
| 73214_2 | 14 | 14 | 3 |
| 73214_2 | 14 | 14 | 4 |
| 73214_2 | 14 | 14 | 5 |
| 73214_2 | 14 | 14 | 6 |
| 73213_2 | 15 | 15 | 9 |
| 73214_2 | 14 | 14 | 7 |
| 73213_2 | 15 | 15 | 10 |
| 73213_2 | 15 | 15 | 11 |
| 73213_2 | 15 | 15 | 12 |
| 73213_2 | 15 | 15 | 13 |
| 73213_2 | 15 | 15 | 14 |
| 73213_2 | 15 | 15 | 15 |
| 73214_2 | 14 | 14 | 8 |
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneEcco una rielaborazione della formula precedente.Questa formula funziona con JMP 14
If( Row() == 1,
dt = Current Data Table()
);
i = Row();
holdBox = :Box;
allrows = dt << get rows where( holdBox == :Box[i] );
If( Loc( As List( allrows ), i )[1] == 1,
1,
:Slot[allrows[Loc( As List( allrows ), i )[1]]] - :Slot[allrows[Loc( As List( allrows ), i )[1] - 1]]
);
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneEcco un piccolo script che dovrebbe darti i risultati desiderati per la data di rimozione
Names Default To Here( 1 );
dt = Current Data Table();
// Add a sequence column to capture the current
// order of the data table
dt << New Column( "tableorder", formula( Row() ) );
// Convert the values in the tableorder column to real values
dt:tableorder << delete formula;
// Sort the table in ascending order
dt = dt << Sort(
By( :Tool, :Part, :Install Date ),
Order( Ascending, Ascending, Ascending ),
replace table( 1 )
);
// Create the Remove Date Column
dt << New Column( "Remove Date", Format( "m/d/y", 10 ) );
// Loop across all of the rows and set the Remove Date
For( i = 2, i <= N Rows( dt ), i++,
If( :Tool[i] == :Tool[i - 1] & :Part[i] == :Part[i - 1],
:Remove Date[i - 1] = :install Date[i]
)
);
// Sort the table back to original order
dt = dt << Sort( By( :tableorder ), Order( Ascending ), replace table( 1 ) );
// Remove the tableorder column
dt << delete columns( "tableorder" );
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneJim,
Lo riprendo: la formula non funzionava perché non conosceva l'espressione Get Rows Where. Non appena ho cambiato il tipo di colonna (era una data, quindi non mi importava davvero) in Numerico, ha funzionato, anche se ancora non gli piace Get Rows Where.
Fondamentalmente, quello che sto cercando di fare è trovare la data precedente per Colonna.
Ho una tabella della cronologia delle sostituzioni delle parti su diversi strumenti:
| Attrezzo | Parte | Data di installazione | Rimuovi data |
| Strumento A | Parte 1 | 03/03/2015 | ??? |
| Strumento B | Parte 1 | 04/04/2015 | ??? |
| Strumento A | Parte 2 | 05/05/2015 | ??? |
| Strumento A | Parte 1 | 06/06/2015 | ??? |
| Strumento A | Parte 2 | 07/07/2015 | ??? |
| | | | |
Quindi, per lo stesso strumento e la stessa parte, devo ottenere la data di installazione NEXT e inserirla come data di rimozione per la parte corrente.
Ora, non sono sicuro di come puoi assicurarti che cerchi effettivamente la data PROSSIMA. La formula funziona con le modifiche minime come posso dire sulle osservazioni limitate, ma per quanto ho capito la formula, non sarebbe ...
Potresti per favore aiutarmi a pulirlo?
Grazie,
M.
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneJim,
Questa è una soluzione alternativa molto preziosa poiché fornisce una funzionalità di una formula inesistente ColLag(); 
Tuttavia, vedo che è passato un po' di tempo da quando hai pubblicato questa soluzione alternativa. JMP 14 al giorno d'oggi non piace come è scritto. Dice Get Rows Where è una funzione sconosciuta e dice che l'utilizzo di Current Data Table () nelle formule non è stabile.
Esiste una versione più recente di questa soluzione alternativa?
Grazie,
M.
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneSe hai bisogno di maggiore precisione nei tempi, @msharp ha notato in un post recente:
Today() è accurato solo al secondo, Tick Seconds() è accurato a 1/60 di secondo e HP TIME() è accurato al microsecondo.
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneCon così tante righe, l'uso del metodo di ordinamento sarebbe più veloce.Di seguito è riportato il metodo che utilizzo per trovare il tempo impiegato da uno script:
inizio = oggi();
la sceneggiatura o parte di una sceneggiatura su cui vuoi trovare i tempi
mostra( oggi() - inizio );
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneCiao Jim,
Grazie per l'aiuto. In realtà, ho più di 60.000 righe in una singola tabella giornaliera se eseguo una formula che fornisci, ci vorrebbe un tempo abbastanza lungo.
Sarebbe più veloce se prima ordinassi i dati e poi eseguissi la formula?
A proposito, c'è un modo per jmp di contare il tempo in cui viene eseguito per uno script o una formula?
Saluti,
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneL'esempio è una formula per una nuova tabella, non uno script autonomo JSL.Crea una nuova colonna e incolla la formula nella formula per la colonna e genererà i valori incrementali desiderati.



Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneCiao Jim,
Ho provato a eseguire lo script che hai creato (basta copiare e incollare l'intero script), tuttavia, non riesco a vedere alcun cambiamento nella tabella dei dati e nessuna nuova colonna da generare.
Ho provato a creare una nuova colonna con il tuo script ma non funziona neanche niente.
Questo è ciò che lo script che ho provato a eseguire,
i = Riga();
allrows = Tabella dati corrente() << ottieni righe where( :Box_ID == :Box_ID );
allrows<< New Column("Test", Numeric, Continuous, Formula(If( Loc( As List( allrows ), i )[1] == 1,
1,
slot[allrows[Loc( As List( allrows ), i )[1]]] - slot[allrows[(Loc( As List( allrows ), i )[1])-1]]
)));
Saluti,
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonneSe l'ordine assoluto dei dati originali non è importante, l'ordinamento dei dati e l'utilizzo della funzione Dif funzionerà.Tuttavia, ecco una formula che puoi utilizzare per calcolare l'incremento senza dover ordinare i dati.
io = Riga () ;
permette = Tabella dei dati correnti () << ottenere righe dove ( : Scatola == : Scatola [ io ] ) ;
Se ( Loc ( Come Lista ( permette ) , io )[ 1 ] == 1 ,
1 ,
fessura [ permette [ Loc ( Come Lista ( permette ) , io )[ 1 ]]] - fessura [ permette [( Loc ( Come Lista ( permette ) , io )[ 1 ]) - 1 ]]
) ;
Ri: Come utilizzare la funzione Dif/Lag per gruppo di colonnePuoi ordinare per :Box e quindi applicare la formula dopo aver verificato che :Box==Lag(:Box,1)?