Seleziona dove si basa su più colonne<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Non sono sicuro se c'è un buon modo per fare ciò che spero di fare, ma ho la seguente situazione:
Ho un file di dati che è il risultato della raccolta di misurazioni ogni secondo. C'è una colonna timestamp, una colonna di stato e quindi tutte le mie colonne di dati.
Ci sono tre diverse voci possibili nella colonna di stato, "RAMP", "WAIT" e "READ". L'ordinamento generale dei dati in base al tempo si traduce, per esempio, in circa 20 righe di "RAMP" seguite da 85 righe di "WAIT" seguite da 9 righe di "READ", che quindi si ripete una dozzina di volte. Le mie regioni di interesse, che vorrei selezionare, sono le ultime 30 righe all'interno di ciascuna sezione etichettata come "ATTESA".
Ovviamente, è estremamente semplice selezionare tutte le righe "WAIT" o le ultime 30 righe dell'intero file, ma non riesco a capire come selezionare solo gli ultimi 30 di ciascuna sezione.
C'è un buon modo per risolvere questo?
Ri: selezionare dove basato su più colonneCome ottenere il nome della tabella e il numero di elementi della lista:
dt = attuale datatable () ;
dt_name = dt << prendi il nome ;
LST = { "un" , "B" , "C" } ;
nitems ( LST ) ;
Usa || concatenare una stringa con un'altra:
"stringa" || ( dt << prendi il nome )
Ri: selezionare dove basato su più colonneUn'altra funzione che * so * deve esistere ma non riesco a trovarla - la tabella dei dati corrente () restituisce un riferimento che posso assegnare a dt, ma sto cercando un modo per estrarre il nome della tabella - Ho uno script Mi piacerebbe correre su molte tabelle diverse, e voglio avviarlo sulla tabella corrente, e quindi creare una nuova tabella sottoinsieme chiamata " ". Mi aspettavo che il nome della tabella di output ("stringa" dt) o ("stringa" $ dt) funzionasse, qualcosa del genere, ma non è così. Sto dando un'occhiata alla documentazione, ma ho pensato di buttare questo commento là fuori nel caso.
Ri: selezionare dove basato su più colonneHo trovato un modo per creare la lista che volevo - ho aggiunto:
last_30_waits = {};
per (j = 1, j <= 3, j ++,
per (i = 0, i <= 3, i ++,
InsertInto (last_30_waits, (wait_end_list- io))));
dt << Seleziona righe (last_30_waits);
Ma ho la sensazione che non sia ottimale. Inoltre, c'è una funzione che restituisce il numero di voci in un elenco? Mi piacerebbe sostituire il "3" nel mio primo ciclo for con quella funzione, ma ho difficoltà a trovarlo.
Ri: selezionare dove basato su più colonneGrazie, questo mi avvicina molto, ma ho ancora una domanda incoerente: qual è il modo migliore per selezionare tutto * tra * ogni coppia di numeri wait_start_list / wait_end_list? Non ho mai lavorato con le liste. (Sono davvero nuovo nello scripting in generale, ma sto cercando di imparare mentre faccio il meglio che posso.)
Ri: selezionare dove basato su più colonneEcco un modo per farlo. Si cercano tutte le righe WAIT e si esegue il ciclo dei numeri di riga. Quando c'è un gap maggiore di 1 hai trovato la fine di una sezione. Il codice seguente crea due elenchi che identificano i numeri di riga iniziale e finale per ciascuna sezione. Ho creato una piccola tabella per questo esempio; cambiare il ntail parametro a 30 per i tuoi dati
dt = Nuova tabella ( "Temp" ,
Aggiungi righe ( 39 ) ,
Nuova colonna ( "Stato" ,
Personaggio ,
Nominale ,
Imposta valori (
{ "RAMPA" , "RAMPA" , "RAMPA" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "LEGGERE" ,
"LEGGERE" , "LEGGERE" , "LEGGERE" , "LEGGERE" , "RAMPA" , "RAMPA" , "RAMPA" , "ASPETTARE" , "ASPETTARE" ,
"ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "LEGGERE" , "LEGGERE" , "LEGGERE" , "LEGGERE" , "LEGGERE" , "RAMPA" ,
"RAMPA" , "RAMPA" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "ASPETTARE" , "LEGGERE" , "LEGGERE" ,
"LEGGERE" , "LEGGERE" , "LEGGERE" }
)
) ,
) ;
wait_rows = dt << ottenere righe dove ( : Stato == "ASPETTARE" ) ;
nr = nrows ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
// Numero di righe WAIT da ottenere
ntail = 4 ;
// Questo otterrà le ultime 4 righe WAIT. Sostituisci con 30 per ottenere le ultime 30 righe WAIT
per ( io = 1 , io <= nr , io ++,
NEW_ROW = wait_rows [ io ] ;
// Cerca uno spazio maggiore di uno nell'elenco delle righe
Se (( NEW_ROW - old_row ) > 1 ,
inserire ( wait_start_list , ( old_row - ntail + 1 )) ;
inserire ( wait_end_list , old_row ) ;
) ;
old_row = NEW_ROW ;
) ;
// Prenditi cura dell'ultima serie di WAIT
old_row = wait_rows [ nr ] ;
inserire ( wait_start_list , ( old_row - ntail + 1 )) ;
inserire ( wait_end_list , old_row ) ;
Ri: selezionare dove basato su più colonneSfortunatamente, al momento sono solo JMP, senza SAS di base, ma grazie per il suggerimento.
Ri: selezionare dove basato su più colonneHai postato questo nel forum JMP, quindi non sono sicuro che questo aiuti o meno. Utilizzando la base SAS, è un programma relativamente breve se si utilizzano gli strumenti giusti:
dati last_30_waits;
group_num + 1;
n_waits = 0;
fare fino a (last.status e status = 'WAIT');
impostare le misure (mantenere = stato);
per stato nonsortito;
se status = 'WAIT' quindi n_waits + 1;
fine;
** A questo punto, group_num identifica un set di WAIT e n_waits mostra quanti record ci sono nel gruppo;
n_found = 0;
fare fino a (last.status e status = 'WAIT');
impostare le misure;
per stato nonsortito;
se status = 'WAIT' allora fare;
n_found + 1;
se n_found> = n_waits - 29 then output;
fine;
fine;
rilascia n_found;
correre;
In bocca al lupo.