Elimina le righe vuote per tutte le colonne di un elencoRisolto: Re: Rimuovere righe con uno o più valori vuoti utilizzando JSL - Pagina 2 - Community utenti JMP
Sulla base di quanto detto sopra, ho uno script per eliminare le righe vuote, ma sembra che elimini quelle in cui sono vuote in QUALSIASI delle colonne elencate, mentre io voglio eliminare quelle in cui sono vuote TUTTE le colonne elencate.
Grazie
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
keeprows = Loc Nonmissing( datacols );
dt << select rows( keeprows ) << invert Row Selection << delete rows;
Automazione e scriptingRe: Elimina le righe vuote per tutte le colonne di un elencoHai studiato a sufficienza il JSL per capire perché non fa ciò di cui hai bisogno?
Dai un'occhiata alla Guida allo scripting su Seleziona dove
Sarà necessario trovare tutte le righe che contengono valori mancanti per la prima colonna in datacols, quindi da quell'elenco di righe selezionare le righe che contengono valori mancanti per la seconda colonna, quindi la terza, ecc. fino a raggiungere l'ultima colonna nell'elenco datacols.
Le righe rimanenti saranno solo quelle con valori mancanti per tutte le colonne in datacols.
A questo punto non ti resta che eliminare le righe rimanenti.
Esaminare l'elemento Current Selection() della funzione Select Where(). Questo limiterà ogni Select Where successivo a esaminare solo le righe selezionate in precedenza quando si applica la selezione.
Re: Elimina le righe vuote per tutte le colonne di un elencoJim
Credo di averlo capito, nato per fallire lo era. La tua idea, però, è carina! Ecco come appare.
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
For(l = Start, l <= End, l++,
full_rows = dt << get rows where( !Is Missing( As Column(cnmes[l]) ) );
For Each Row(If(is missing(cnmes[i]), Remove From(full_rows))));
dt << Select Rows(full_rows) << Invert Row Selection << Delete Rows;Re: Elimina le righe vuote per tutte le colonne di un elencoFunziona? Non capisco come. Stai trattando ogni colonna in modo indipendente l'una dall'altra. Stai reimpostando full_rows per ogni colonna.
Ecco un esempio di utilizzo di selezione multipla where()_per restringere le righe che si desidera selezionare
names default to here(1);
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// Select all males
dt << select where( :Sex == "M");
// From all of the selected males, select all of the 12 year olds
dt << select where( :age == 12, Current Selection("Restrict"));Re: Elimina le righe vuote per tutte le colonne di un elencoNon sono esattamente sicuro di cosa stia succedendo nella prima parte del tuo script o di come sia correlato a questa domanda (creare un elenco di colonne?), ma puoi fare questo: usando la piattaforma JMP (modello di dati mancanti), seleziona dove (come ha suggerito Jim) o ad esempio con l'indicizzazione della tabella dati + ciclo / indicizzazione della tabella dati + alcune operazioni di matrice.
Per prima cosa, proverei con la piattaforma Missing Data offerta da JMP. Verifica se può essere utilizzata a questo scopo (lo è), dopodiché dai un'occhiata all'opzione "Seleziona dove" suggerita da Jim. Dopo aver scritto lo script e aver capito come funziona il suggerimento di Jim, puoi iniziare a valutare le opzioni di sottoscrizione alle tabelle dati che suggerisco di seguito, se ancora lo desideri.
Modello di dati mancante
Utilizzo di JMP > Immetti e modifica i dati > Organizza i dati nelle tabelle dati > Visualizza i modelli di dati mancanti nelle tabelle dati
Guida alla creazione di script > Tabelle dati > Scripting avanzato per tabelle dati > Trova modelli di dati mancanti


Questo utilizza operazioni di matrice e penso che dovrebbe funzionare
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(11),
Compress File When Saved(1),
New Column("Column 1", Character, "Nominal", Set Values({"", "", "aa", "", "a", "a", "", "a", "", "a", ""})),
New Column("Column 2", Character, "Nominal", Set Values({"", "a", "a", "a", "a", "", "", "a", "a", "", ""})),
New Column("Column 3", Character, "Nominal", Set Values({"a", "", "a", "", "a", "", "a", "", "", "", "a"}))
);
cols_to_check = {"Column 2", "Column 3"};
m = Matrix(IsMissing(dt[0, cols_to_check]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
Questo eseguirà un ciclo sulle righe durante il controllo dei valori mancanti
rows_to_delete = {};
For Each Row(dt,
m = Loc Nonmissing(dt[Row(), cols_to_check]);
If(N Items(m) == 0,
Insert Into(rows_to_delete, Row());
);
);
dt << Select Rows(rows_to_delete);
Re: Elimina le righe vuote per tutte le colonne di un elencomanca (elenco) e manca (matrice)
bello! - e inaspettato.


Esiste una panoramica generale delle funzioni JSL che possono essere "vettorializzate"?
Re: Elimina le righe vuote per tutte le colonne di un elencoPensavo che lo script funzionasse, ma ha un difetto, come hai sottolineato. Ho provato l'idea di @Jarmo e funziona, ma non mi permette di popolare la matrice.
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Device 2" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Device 2"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "Process Script" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "start_date"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
m = Matrix(IsMissing(dt[0, datacols]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
Re: Elimina le righe vuote per tutte le colonne di un elencoLe colonne dei tuoi dati includono ciò che stai cercando? Inoltre, devi adattare le due opzioni ai tuoi dati, come ad esempio
rows_to_delete = Loc(V Sum(m`) == N Items(cols_to_check));
potrebbe essere una buona idea
Re: Elimina le righe vuote per tutte le colonne di un elencoJarmo
Ha funzionato. In realtà mi chiedevo il significato del 2.
Grazie