Script JSL per filtrare intere righe in cui una particolare colonna contiene valori mancantiCara comunità,
sono un utente principiante e vorrei chiedere il vostro gentile aiuto con il mio codice seguente. L'argomento della funzione "is missing" sembra non corretto.
Vorrei che lo script mostrasse una tabella in cui vengono visualizzate le righe che contengono valori in determinati intervalli. Inoltre, le righe con celle vuote nelle due colonne utilizzate per il filtraggio devono essere escluse.
Ecco il codice:
dt = Current Data Table(); // Assumes you have a data table already opened
// Convert Column1 to numeric data type
dt << As Numeric("Temperatur");
// Convert Column2 to numeric data type
dt << As Numeric("Menge");
// Create the conditions to filter the rows
condition1 = Column(dt, "Temperatur") << Get Values() > 25;
condition2 = Column(dt, "Menge") << Get Values() > 0;
// Create a condition to remove empty cells
condition3 = Any(Is Missing(dt << Get Values("Temperatur"))) == 0 | Any(Is Missing(dt << Get Values("Menge"))) == 0;
// Apply all three conditions to filter the data table
filtered_dt = dt << Select Where(condition1 & condition2 & condition3);
// Show the filtered data table
filtered_dt << Show();
Grazie mille in anticipo per la navigazione. Sto usando JMP versione 17
Michele
Automazione e scriptingRe: Script JSL per filtrare intere righe in cui una particolare colonna contiene valori mancantiGrazie mille, Jthi, con il tuo aiuto ce l'ho fatta!
Re: Script JSL per filtrare intere righe in cui una particolare colonna contiene valori mancantiGrazie mille, Hogi, con il tuo aiuto ce l'ho fatta!
Re: Script JSL per filtrare intere righe in cui una particolare colonna contiene valori mancantiStai combinando il confronto di matrici e la selezione dalla tabella dati, in questo caso molto probabilmente vorrai semplicemente usare << Seleziona dove o << Ottieni righe dove e non << Ottieni valori (potresti voler usare << Ottieni righe dove invece di << Seleziona dove, ma questo dipende da cosa vuoi fare).
È possibile combinare le condizioni direttamente in un'unica istruzione Select Where (se si desidera separarle, lo farei con i commenti, a meno che non si desideri riutilizzare esattamente le stesse istruzioni)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
dt << Select Where((:height > 60) & (:weight > 90));
selrows = dt << get selected rows; // to get a matrix of selected row numbers
r = dt << Get Rows Where((:height > 60) & (:weight > 90));
e in questo caso non è necessario controllare i valori mancanti
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt[[1 2 3 20 30], "height"] = .;
dt[[10 15 16 30], "weight"] = .;
// Comparison
r1 = dt << Get Rows Where((:height > 60) & (:weight > 90) & (!IsMissing(:height) | !Is Missing(:weight)));
r2 = dt << Get Rows Where((:height > 60) & (:weight > 90));
r1 == r2;Re: Script JSL per filtrare intere righe in cui una particolare colonna contiene valori mancantiCiao Michal.
La cosa bella di JMP: non devi conoscere nessuno scripting, puoi usare semplicemente l'interfaccia grafica e il mouse.
Dopo aver eseguito i passaggi, puoi andare al registro avanzato e controllare il codice...
- Righe/Selezione riga/Seleziona dove (Ctrl + W)

- apri la vista dati per le righe selezionate:

- controlla il registro:

Jmp capisce cosa vuoi e combina anche i due passaggi in un'unica riga di codice:

Se vuoi costruire il comando autonomamente, puoi definire alcune stringhe, concatenarle e quindi analizzare e valutare il codice finale:
cond1 = "Is Missing( :age )";
cond2 = ":age > 16";
Eval(Parse("dt << Select where( "|| cond1 || " | " || cond2 || " ) << Data View;"))
Il mio consiglio: investi un po' di tempo per imparare e comprendere la gestione delle espressioni
Un ottimo tutorial: Utilizzo di JSL per sviluppare applicazioni efficienti e robuste (EU 2018 415) di @joseph_morgan
Vedrai che in realtà è molto simile al tuo approccio:
memorizzare alcune condizioni come "simboli" JSL condizione 1, condizione 2 ... quindi utilizzarle per costruire l'espressione finale e valutarla.
Con alcune correzioni al codice e Expr() e Name Expr() qua e là (per evitare che Jmp valuti le condizioni prima che possano essere inserite nella riga finale del codice), il codice dovrebbe apparire così:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
condition 1 = Expr(Is Missing( :age ));
condition 2 = Expr(:age > 16 );
combined condition=Expr(or());
Insert into(combined condition, Name Expr(condition1));
Insert into(combined condition, Name Expr(condition2));
Eval(Substitute(dt << Select where( _cond_ ) << Data View),
Expr(_cond_),Name Expr(combined condition)));