Formula per utilizzare il valore precedente se non mancante, altrimenti utilizza il valore dell'ultima cella occupataSto cercando di scrivere una formula in Col3 che aggiunga il valore corrente di Col1 con il valore ritardato di Col2 ma mi imbatto in un problema cercando di capire come portare avanti l'ultima osservazione da Col2 quando si incontrano dati mancanti e per utilizzare questo valore alla prima istanza di dati non mancanti.Questo è,
If( !IsMissing( Col1)
Col1 + Lag(Col2,1);
//create variable that contains current Col2 value;
//Else
Col1 + previously stored value from Col2;
);
Gradirei qualsiasi suggerimento sul modo migliore per realizzare questo.Grazie.
| Riga# |
col.1 |
Col2 |
Col3 |
|---|
| 1 |
2 |
1 |
|
| 2 |
1 |
3 |
2 |
| 3 |
1 |
5 |
4 |
| 4 |
2 |
7 |
7 |
| 5 |
. |
. |
|
| 6 |
. |
. |
|
| 7 |
. |
. |
|
| 8 |
2 |
8 |
9 |
| 9 |
2 |
9 |
10 |
| 10 |
1 |
11 |
10 |
| 11 |
. |
. |
|
| 13 |
. |
. |
|
| 14 |
2 |
12 |
13 |
| 15 |
2 |
13 |
14 |
| 16 |
1 |
14 |
14 |
| 17 |
2 |
15 |
16 |
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataGrazie Jerry per la tua fantastica spiegazione e per aver anticipato la mia prossima domanda sull'incorporazione degli ID!
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataScusa se non ho fornito più di una spiegazione nella mia risposta precedente. Innanzitutto, per far funzionare la formula per la tua tabella dati, modifica la colonna "Data" nelle istruzioni "Se" in "Risultato biopsia" e l'argomento "Ora" nella funzione Differenza data in qualsiasi intervallo necessario (ad esempio "Giorno" 
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) )
)
)
Ora per la spiegazione. Le formule esistenti non si indicizzano automaticamente all'indietro o in avanti finché non trovano dati non mancanti, quindi ho fatto ricorso allo scripting per creare variabili che contengano le informazioni necessarie. Se vuoi saperne di più sullo scripting, Aiuto->Libri->Guida allo scripting e Aiuto->Indice allo scripting sono ottime risorse.
L'istruzione ":Biopsy Result<
Successivamente, se manca il risultato della biopsia, il risultato viene impostato come mancante, altrimenti è necessario fare riferimento alla data precedente non mancante per il calcolo della differenza di data. Contains(nm, Row()) trova la posizione della riga corrente nella matrice "nm". Sottrai 1 da questo per trovare la posizione della riga precedente nella matrice "nm". Questo ora è l'indice, cioè il numero di riga, per il valore della data nella riga con il precedente risultato della biopsia non mancante. La funzione "Try" ignora l'errore generato dalla funzione Date Difference quando non esiste una riga precedente non mancante (ovvero la prima istanza di un risultato della biopsia).
Un paio di cose da tenere a mente, questo presuppone che i tuoi dati siano ordinati per data all'interno dell'ID # (come nel tuo esempio). Inoltre, se hai più ID # nella tua tabella di dati, potresti voler aggiungere un'altra condizione in modo da non confrontare due ID diversi. In questo caso, la tua formula/script potrebbe essere simile a questa:
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
If( :ID # == :ID #[nm[Contains( nm, Row() ) - 1]],
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) ),
.
)
)
)
So che queste sono molte informazioni, ma hai detto che eri "ansioso di imparare questo" ... spero che questo aiuti.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataPotresti trovare il Strumenti tabella dati componente aggiuntivo utile per questi casi.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataGrazie Jerry. Questo sembra esattamente quello di cui ho bisogno.
Sfortunatamente sono un principiante in questo e ho ancora bisogno di aiuto per capire come posso ricrearlo da solo nel mio database e nell'editor di formule. Ho allegato una versione molto semplificata delle colonne di interesse per un singolo paziente nei miei dati.
Nel mio database ci sono molte righe di dati con valori di laboratorio che stiamo seguendo, tuttavia solo alcune righe hanno un risultato di biopsia. Voglio creare una formula che utilizzerà le date nella colonna "Date" per calcolare la differenza di data tra le biopsie ogni volta che si verificano.
Purtroppo non capisco quali funzioni hai usato per creare la tua formula.... per esempio... anche se se hai usato la funzione "Is missing" molte volte non vedo nemmeno l'opzione di "Loc Nonmissing" in l'editor di formule.
Inoltre, cosa significa "nm"... Presumo "qualcosa di matrice" ma dove lo trovo nell'editor di formule?
Ci scusiamo per il fastidio, ma sono ansioso di apprenderlo perché sembra esattamente quello di cui ho bisogno.
grazie ancora,
CW
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataSfortunatamente, non riesco a vedere la tabella di esempio che hai fornito, tuttavia, il file allegato potrebbe darti un'idea per un approccio per prendere la differenza tra le date non mancanti attuali e precedenti.
La formula nella seconda colonna stabilisce innanzitutto una matrice di righe per le celle non mancanti nella colonna Data. Ciò fornisce un modo per fare riferimento alla riga precedente non mancante che viene utilizzata come indice nella funzione Differenza data.
Sono sicuro che ci sono altre idee per farlo...
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataQuello che mi sto stancando di fare è porre la domanda .... qual è la differenza di data tra due diverse biopsie (colonna etichettata TCMR) per un dato paziente (numero pt nella prima colonna) nel mio database. Le biopsie si verificano a intervalli irregolari e l'esito della biopsia è mostrato nella terza colonna sottostante.
Anche se so come recuperare queste informazioni se creo semplicemente un sottoinsieme delle sole righe che contengono un risultato della biopsia e poi chiedo la differenza di data .... quello che mi piacerebbe fare è trovare un modo per determinare la differenza di data tra qualsiasi riga che ha un risultato di biopsia ignorando le righe vuote.
@jerry_cooper ha scritto:
Penso che questa formula ti darà quello che stai cercando:
If(Is Missing(:Column 1), :Column 1, Summation(i = 1, Row(), :Column 1))
Spero che questo ti aiuti.
-Jerry
Puoi aiutare con questo. Idealmente con una soluzione che posso vedere nell'editor di formule o che posso incollare al suo interno.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataCredo che questa risposta sia stata scritta prima del rilascio di JMP 13 che ha introdotto la funzione Col Cumulative Sum(). Se stai utilizzando v13 o versioni successive, tutto ciò che devi fare per creare una colonna di somma cumulativa è fare clic con il pulsante destro del mouse sull'intestazione della colonna per la colonna che desideri sommare e selezionare Nuova colonna formula=>Riga=>Somma cumulativa. Questo creerà una nuova colonna con la formula appropriata. Per visualizzare la formula nell'editor, fai clic con il pulsante destro del mouse sulla nuova colonna e seleziona Formula.
Se stai utilizzando una versione precedente, copia e incolla la seguente istruzione nell'editor di formule per vedere come appare:
Summation(i=1, Row(), Your Column[i])
Spero che questo ti aiuti.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataPenso che anche questo sia esattamente ciò di cui ho bisogno, ma non capisco appieno lo script... è possibile mostrare come sarebbe nell'editor di formule...
grazie mille
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataMi imbatto sempre in questo problema e utilizzo la soluzione fornita da Jerry. Analizzo le misure di processo (temperatura, pressione, flusso, ecc.) che vengono recuperate da uno storico dei dati compressi. Ogni poche migliaia di punti può esserci un valore mancante.
L'esempio seguente calcola se il reattore è in funzione o meno in base alla media mobile a 3 punti del flusso del catalizzatore, F.Cat >= 11 (anonimizzato sì, ottieni il riferimento...). Se manca F.Cat, calc utilizza il valore della riga precedente di "Running?".
If(
Row() < 3, 0,
Is Missing( :F.Cat ), Lag( :Name( "Running?" ), 1 ),
(Lag( :F.Cat, 2 ) + Lag( :F.Cat, 1 ) + :F.Cat) / 3 >= 11, 1,
0
)
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupata<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Grazie a tutti per i vostri commenti e aiuto.
Penso che il suggerimento di Jerry funzioni al meglio per me e non richiedesse l'uso di una variabile locale che è quello che volevo usare.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataPenso che questa formula ti darà quello che stai cercando:
If( Is Missing( :Column 1 ),
:Column 1,
Summation( i = 1, Row(), :Column 1 )
)
Spero che questo ti aiuti.
-Jerry
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataSiamo sempre riusciti ad avere una rubrica Formula autoreferenziale?Non mi sono mai reso conto di poterlo fare.
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataGrazie Jim e Jeff,
Penso di aver reso il problema più complicato di quanto dovrebbe essere nella mia descrizione e nel layout della tabella e posso vedere come ciò potrebbe averti portato ai tuoi suggerimenti.
Sebbene comprenda il tuo suggerimento Jeff sulla creazione di una nuova colonna che contenga i dati non mancanti, spero di portare a termine il mio lavoro senza creare nuove colonne poiché utilizzerò questa formula per molte colonne diverse.Consentitemi di essere più chiaro su ciò che sto cercando di realizzare tramite la tabella sottostante.
Sto cercando di creare una somma parziale della colonna 1 nella colonna 2. Senza creare colonne aggiuntive, speravo di creare una variabile che contenga l'attuale valore della somma parziale nella colonna 2 e lo aggiunga al valore della colonna 1.
Il mio problema non è conoscere il modo migliore per creare e utilizzare una variabile che contenga il valore attuale per la colonna 2 in modo che questo valore possa essere "trasportato" tra le righe dei dati mancanti della colonna 1.La colonna "Risultato che sto cercando" mostra ciò che vorrei che la formula nella colonna 2 producesse.Spero che questa descrizione sia un po 'più chiara su ciò che sto cercando di realizzare.

Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataPenso ci sia un errore nella tua descrizione che dovremo chiarire prima di poterti dare una soluzione precisa. Il tuo condizionale dice che se Col1 NON È MANCANTE, aggiungilo al valore ritardato di Col2, e se Col1 È MANCANTE, aggiungilo a un valore precedentemente memorizzato di Col2.
Non puoi aggiungere un Col1 mancante a nulla e ottenere qualcosa di diverso da quello mancante.
Detto questo, costruirei questa tabella una colonna alla volta. Nello specifico, creerei una colonna "Col2 non mancante" che non presentava valori mancanti utilizzando la formula:

Questa formula imposta "Col2 non mancante" su Col2 quando Col2 non manca e lo imposta sul ritardo di "Col2 non mancante" quando Col2 manca.

È quindi possibile utilizzare un ritardo (Col2 non mancante, 1) nella formula finale.
Spero che aiuti.
- Jeff
Re: Formula per utilizzare il valore precedente se non mancante, altrimenti utilizzare il valore dell'ultima cella occupataEcco una versione della formula che funziona:
If( Row() == 1, lagval = . );
x = Sum( :col 1, lagval );
If( Is Missing( col 2 ) == 0,
lagval = :col 2
);
x;