Usa If Then on Matrix<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao gente,
Ho alcuni dati sugli strumenti che mostrano periodicamente grandi cambiamenti nei dati a causa della riaggiustamento dello strumento. Sto cercando di creare una nuova variabile che faccia quanto segue: If (data - data [i-1]> 4) o (dati - data [i-1] <-4), quindi adj_data = adj_data [i-1], Else, data = adj_data + (dati - data [i-1]); In sostanza, se il valore dei dati correnti supera il valore precedente di 4 o -4, quindi creare un nuovo valore regolato uguale al valore regolato precedente, Else, aggiungere la differenza tra il valore dei dati corrente e precedente al valore regolato.
Ho capito come leggere i dati in una matrice e rimuovere tutti i dati mancanti, ma non sono sicuro di come completare la matematica descritta sopra sulla matrice. Qualche suggerimento su come realizzare questo sarebbe apprezzato.
Pulisci il registro();
Nomi predefiniti qui (1);
dt = Nuova tabella ("Adatta per dati mancanti",
Aggiungi righe (24),
Comprimi il file quando salvato (1),
Nuova colonna ("Data",
Numerico,
Continuo,
Formato ("m / d / y", 19),
Formato di input ("m / d / y"),
Imposta valori (
[3447619200, 3447705600, 3447792000, 3447878400, 3447964800,
3448051200, 3448137600, 3448224000, 3448310400, 3448396800,
3448483200, 3448569600, 3448656000, 3448742400, 3448828800,
3448915200, 3449001600, 3449088000, 3449174400, 3449260800,
3449347200, 3449433600, 3449520000, 3449606400]
)
),
Nuova colonna ("Dati1",
Numerico,
Continuo,
Formato ("Migliore", 12),
Imposta valori (
[11, 13, 50, 15,., 17, 18, -20, 20,., 21, 22,., 24, 25, 23,.,.,
.,., 25, 26, 27, 28]
)
),
Nuova colonna ("Adj Data1",
Numerico,
Continuo,
Formato ("Migliore", 12),
Imposta valori (
[0, 2,., 4,., 6, 7,., 9,., 10, 11,., 13, 14, 12,.,.,.,., 14,
15, 16, 17]
)
)
);
// Metti i dati rilevanti nella matrice
date_time =: Name ("Date") << Get Values;
data =: Name ("Data1") << Get Values;
// Determina le righe che includono solo i dati che non mancano
row_list = dt << ottieni le righe dove (
E(
! Manca (: Data1),
Contiene (dati,: dati1),
Contiene (data,: Data1) == Contains (date_time, Format (: Date, "mdy"))
)
);
// Converte row_list, attualmente una matrice [], in una lista {}
Elenco (row_list = As List (row_list));
date_time = date_time [Loc (! Is Missing (data))];
data = data [Loc (! Is Missing (data))];
Ri: Usa If Then on MatrixMi dispiace Jeff non ero più chiaro su quello che sto cercando di realizzare. Potrei aver confuso le cose parlando sia del codice JSL che delle formule di colonna.
Il file di dati allegato mostra l'output "desiderato" in: adj_data1 e l'output dalla formula della colonna fornita in New Adj Data. Notare che la colonna New Adj Adjers inserisce il valore New Adj Data precedente quando: data1 è mancante, anche se l'obiettivo è avere New Adj Data mostra i dati mancanti quando: data1 è mancante.
Per creare la colonna: adj_data1, stavo cercando di adattare la formula della colonna in modo che:
- Quando manca: data1, il precedente valore New Adj Data viene inserito in una variabile locale e portato avanti fino al momento necessario al passaggio 2
- Se corrente: il valore data1 non è mancante e precedente: manca il valore data1, quindi New Adj Data viene impostato nell'elenco dei valori correnti nella variabile locale.
Il punto in cui mi sto bloccando è aggiungere il valore New Adj Data nel passaggio 1 a una variabile locale e quindi recuperare / utilizzare quel valore per il passaggio 2.
Forse lo sto rendendo più complicato di quanto dovrebbe essere, e tu hai un modo semplice per farlo. Apprezzerei sicuramente qualsiasi aiuto tu possa fornire. Se la tua soluzione non utilizza una variabile locale nella formula della colonna, apprezzerei anche la possibilità di fornire un semplice esempio di come utilizzare una variabile locale come quella descritta sopra, o indirizzarmi a un dataset JMP esistente che fa uso di variabili locali nella formula della colonna. Sembra che essere in grado di utilizzare con successo le variabili locali nelle formule di colonna sarebbe molto utile. Grazie ancora.
Ri: Usa If Then on MatrixAvete qualche indicazione su come posso realizzare il seguente codice JSL usando le variabili locali in una formula di colonna?
Se si definiscono le variabili in un programma JSL e si desidera utilizzarle in una formula di colonna, devono essere variabili globali. Prefix le variabili con "::" e puoi usarle in una formula di colonna. Per esempio :: g_one_variable
Ri: Usa If Then on MatrixCiao Terapin,
Ho paura di avere difficoltà a decifrare ciò che stai cercando di fare in base al JSL che hai inviato.
La tabella di dati che ho allegato sopra si occupa dei valori mancanti in data1 senza la necessità di una variabile locale nella formula. Controlla se Data1 è mancante nella riga corrente o nella riga precedente con! È mancante (: Dati1 - Lag (: Dati1,1)). Se mancano entrambi, anche la differenza mancherà.
Ecco la formula nella colonna New Adj Data:
Se(
Riga () == 1, 0,
Abs (: Data1 - Lag (: Data1, 1))> 4 | Manca (: Data1 - Lag (: Data1, 1)), Lag (: New Adj Data, 1),
Lag (: New Adj Data, 1) + (: Data1 - Lag (: Data1, 1))
)
Se questo non è ciò di cui hai bisogno, puoi pubblicare una tabella di dati di esempio insieme a una spiegazione esatta di ciò che vorresti fosse il valore di questa nuova colonna basata su formula in ogni riga? Questo mi aiuterà a capire esattamente quello che stai cercando.
Grazie!
-Jeff
Ri: Usa If Then on MatrixGrazie Jeff per aver fornito un esempio di una formula di colonna, nonché degli esempi di matrice. Come puoi immaginare, il mio caso è un po 'più complicato e richiede che salti le righe in cui mancano i dati ma porti avanti il valore dei dati aggiustato in precedenza. Sono in grado di farlo con il seguente codice JSL, ma non riesco a capire come utilizzare le variabili locali in una formula di colonna. Avete qualche indicazione su come posso realizzare il seguente codice JSL usando le variabili locali in una formula di colonna? Grazie.
Pulisci il registro();
lag_adj_data = 0;
: adj_data1 [1] = 0;
Per (i = 2, i <= N Rows (dt1), i ++,
Se (Abs (: data1 -: data1 [i - 1])> 4,
: adj_data1 =: adj_data1 [i - 1],
: adj_data1 =: adj_data1 [i - 1] + (: data1 -: data1 [i - 1])
);
Se (Manca (: data1 ) &! È mancante (: adj_data1 [i-1]),
lag_adj_data =: adj_data1 [i-1];
);
Se (Manca (: data1 [i-1]) &! Manca (: data1 ),
: adj_data1 = lag_adj_data
);
);
Ri: Usa If Then on MatrixCome ho già accennato ieri, le formule delle colonne sono, in generale, abbastanza efficienti.
Vedi la tabella dei dati allegata. La colonna New Adj Data ha una formula che si avvicina a ciò che stai cercando.
Questo è ancora un piccolo set di dati, ma dovrebbe comunque funzionare bene con molte righe.
-Jeff
Ri: Usa If Then on MatrixLe matrici funzionano come variabili regolari, più precisamente chiamate scalari - con la maggior parte degli operatori aritmetici e di confronto.
Per esempio:
X = [ 1 , 2 , 3 , 4 ] ;
y = [ 2 , 1 , 2 , 5 ] ;
X > y ;
/ *:
[0, 1, 1, 0]
Come puoi vedere ora ho una matrice che indica dove la matrice y è maggiore della matrice x.
Ma non sei limitato a confrontare una matrice con un'altra. Puoi anche confrontarlo con uno scalare.
X > 2 ;
/ *:
[0, 0, 1, 1]
Posso anche eseguire operazioni aritmetiche sull'intera matrice in una sola volta.
X - 4 ;
/ *:
[-3, -2, -1, 0]
È possibile indicizzare in una matrice per ottenere solo una parte della matrice in modo da poter facilmente confrontare una porzione della matrice con un'altra.
y [ 2 :: nrow ( y )] > y [ 1 :: nrow ( y ) - 1 ] ;
/ *:
[0, 1, 1]
Puoi anche usare le funzioni su una matrice.
z = [ 1 , 5 , 1 , - 6 ] ;
addominali ( z [ 2 :: nrow ( z )] - X [ 1 :: nrow ( z ) - 1 ]) > 4 ;
/ *:
[0, 0, 1]
Combinando tutto questo dovresti essere in grado di fare ciò che stai cercando con le matrici.
Tuttavia, una formula di colonna nella tabella dati sarebbe più semplice e probabilmente altrettanto efficiente. Seguirò domani con un esempio di questo.
-Jeff
Ri: Usa If Then on MatrixGrazie a PMroz per il suggerimento. Questo funzionerà sicuramente sui dati nella tabella, ma la tabella ha circa 500.000 record e stavo pensando che fare le regolazioni in una matrice sarebbe stato più rapido rispetto alla tabella dei dati direttamente. Avete suggerimenti sulla sintassi per l'uso di comandi condizionali su una matrice? Ho cercato nei vari "libri" di JMP ma non ho trovato nulla che specifichi chiaramente la sintassi. Grazie.
Ri: Usa If Then on MatrixPenso che questo farà quello che vuoi. Sto operando direttamente sul tuo tavolo, btw.
dt = tabella dati ( "Regola per dati mancanti" ) ;
per ( io = 2 , io <= nrows ( dt ) , io ++,
di = colonna ( dt , "Data1" ) [ io ] ;
DIM1 = colonna ( dt , "Data1" ) [ io - 1 ] ;
adji = colonna ( dt , "Adj Data1" ) [ io ] ;
Se ( ! manca ( di ) & ! manca ( DIM1 ) ,
Se ( addominali ( di - DIM1 ) > 4 ,
// poi
colonna ( dt , "Adj Data1" ) [ io ] = colonna ( dt , "Adj Data1" ) [ io - 1 ] ;
,
// altro
Se ( ! manca ( adji ) ,
colonna ( dt , "Data1" ) [ io ] = adji + ( di - DIM1 ) ;
) ;
) ;
) ;
) ;