JSL: trova la% dei dati mancantiHo una tabella dati con 3 colonne

Devo creare una tabella che mostri la percentuale di dati mancanti nella colonna HEIGHT raggruppati per ID e SUB_ID. Nel caso sopra il risultato dovrebbe essere:

Ma in alcuni casi è possibile che non vi siano righe con dati mancanti. In tal caso, la percentuale mancante dovrebbe essere 0.

Ho bisogno di aiuto per scrivere uno script JSL per questo. Apprezzerò qualsiasi consiglio. Ho tre problemi nel mio script qui sotto:
1. Come posso tenere traccia dell'handle/riferimento a una tabella dati in modo da poterlo richiamare in qualsiasi momento. Ho sempre usato "dt = CurrentDataTable" all'inizio dello script. Ma dopo aver creato alcune tabelle di riepilogo/tabelle di sottoinsieme, perdo il riferimento alla tabella originale e non so come renderla attuale.
2. Ho bisogno che funzioni anche quando non ci sono righe mancanti. In questo momento lo script si ferma a metà.
3. Ho bisogno che tutti i tavoli si chiudano tranne il tavolo finale con la percentuale mancante.
// Read the original table
dt = CurrentDataTable();
main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt<< Summary(Group(:ID, :SUB_ID), Freq("None"), Weight("None"), output table name( "Main Table Summary"));
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
Current Data Table(Data Table(main_table));
dt = CurrentDataTable();
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));
If( !Is Empty( dt_missing ),
dt_missing_summary = Data Table( dt_missing ) << Summary(
Group( :ID, :SUB_ID ),Freq("None"), Weight("None"), output table name( "Missing Rows Table Summary"));
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
//Close( dt_missing, nosave );
//Close( dt_summary, nosave );Grazie
Combinazione e pulizia dei datiRi: JSL - Trova la % dei dati mancantiGrazie per la risposta. Fino ad ora non sapevo che N Missing potesse essere utilizzato per trovare le righe di dati mancanti. Ha reso il lavoro molto più semplice e ha ridotto alcuni passaggi nella sceneggiatura.Ri: JSL - Trova la % dei dati mancantiGrazie per la spiegazione passo passo. I passaggi 1, 2 e 4 sono i nuovi trucchi che ho imparato e sono molto utili. Non c'è da stupirsi perché il mio script falliva se non c'erano dati mancanti. Mi ricorderò di dividere l'istruzione quando applichi più condizioni.Ri: JSL - Trova la % dei dati mancantiGrazie per la soluzione semplice e compatta. Aggiunge una colonna extra alla tabella originale ma questo non è un problema per me.Ri: JSL - Trova la % dei dati mancantiPER FAVORE, RILEGGI se l'hai visto prima. C'è stato un errore.
L'utilizzo della funzione incorporata di JMP, Col N Missing ( ), semplifica questa attività. Mostrerò 2 approcci.
SOLUZIONE N. 1:
- Crea una colonna per contare i dispersi per gruppo nella prima tabella.
- Riepiloga la prima tabella.
- Cambia il nome della colonna N righe (se lo desideri) e crea una colonna formula per il rapporto.
Names Default To Here( 1 );
//these 2 lines just create a table with overall missing rate of 35% for the weight varable.
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//add a formula column to compute n missing rows.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
//create summary table, rename N Rows column, and add a % missing formula column.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows));
dtSum:N Rows << set name("Total Rows");
dtSum << new column ("Pct Missing", formula(:missing rows / :total rows));
SOLUZIONE N.2:
- Crea tutte le colonne formula nella prima tabella, quindi crea un semplice riepilogo.
- Facoltativamente, eliminare la colonna N righe dalla tabella di riepilogo.
** Il "trucco" in questo metodo è nella funzione Total Rows ( ). È necessario iniziare con un "1" per il primo argomento, in modo che funga da colonna fittizia, poiché il primo argomento non può essere utilizzato come colonna di raggruppamento. Ometti 1 e vedrai che i conteggi riflettono solo il numero di righe nel gruppo "tipo"... non la combinazione di paese e tipo.
Saluti e scuse per l'errore la prima volta.
Names Default To Here( 1 );
//don't worry about these; these are just to get a table present with some missing values @ an
//overall missing rate of 35%
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//create formula columns using built-in functions to get what you're after.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
dt << New Column( "Total Rows", formula( Col Number( 1, :country, :type ) ) );
dt << New Column( "Group Pct Missing", formula( :missing rows / :total rows ) );
//view summary table.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows, :total rows, :group pct missing));
Ri: JSL - Trova la % dei dati mancanti- Devi aggiungere
Names Default To Here( 1 );
per limitare le variabili specificate nello script in modo che non vengano modificate da variabili in altri script con lo stesso nome, modificando i valori nello script corrente
- Sembra che tu abbia un malinteso sulla funzione Current Data Table().Può essere utilizzato in 2 modi diversi e ti aiuterà a non perdere il riferimento alla tabella dati originale.La specifica
dt = Current Data Table();
hai usato correttamente.E quando più avanti nel tuo script, vuoi rendere la tabella dati originale la "tabella dati corrente", tutto ciò che devi fare ècurrent data table(dt);
Ciò dirà a JMP di utilizzare "dt" come tabella dati corrente.Ciò che devi evitare di fare è riassegnare "dt" posizionandolo sul lato sinistro di un "=".
- A volte non è una buona cosa combinare le azioni in un'unica affermazione.Tuo
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));si aspetta di selezionare le righe e creare sottoinsiemi della tabella in un'unica istruzione.Il problema è che non riuscirà a darti ciò che desideri se non ci sono valori mancanti di :Height.Nella mia rielaborazione del tuo script (sotto) la tabella dati dt ha le righe selezionate o meno, quindi viene effettuato il controllo per vedere se sono state trovate righe mancanti e, in tal caso, solo allora continuare l'elaborazionedt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- La funzione Try() è molto utile nell'esecuzione di funzioni che potrebbero fallire e, se lo fanno, non vuoi che lo script smetta di funzionare.Le funzioni Close() che stai utilizzando e ottime per utilizzare la funzione Try()
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Spero che questo sia utile... se hai altre domande, rispondi
Names Default To Here( 1 );
// Read the original table
dt = Current Data Table();
//main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt << Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Main Table Summary" )
);
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
//Current Data Table(Data Table(main_table));
//dt = CurrentDataTable();
dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
dt_missing = dt << Subset( Output Table Name( "Missing Rows" ), selected rows( 1 ) );
dt_missing_summary = Data Table( dt_missing ) <<
Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Missing Rows Table Summary" )
);
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Ri: JSL - Trova la % dei dati mancanti@jthi ,
Stavamo pensando sulla stessa linea allo stesso tempo, mi piace che la tua risposta sia un po' più completa della mia e sono d'accordo con i suggerimenti dei punti 1 e 3.
Ri: JSL - Trova la % dei dati mancantiPer prima cosa suggerisco vivamente di consultare la guida allo scripting JMP: Guida allo scripting JMP15 e Indice di scripting trovato da Jmp / Aiuto / Indice di scripting. Queste sono ottime fonti per lo scripting JSL.
Per svolgere questa attività non avrai bisogno di jsl:
1. Iniziamo con la tabella di esempio che ci hai fornito con due valori mancanti
2. Creare un riepilogo della tabella con N mancanti con Altezza come statistiche e SUB_ID e ID come Gruppo


3. Crea una nuova formula selezionando N righe e N colonne mancanti (ALTEZZA).

4. Modificare il formato in Percentuale da Proprietà colonna e rinominare le colonne secondo necessità
Sulla base di questi passaggi potresti anche utilizzare abbastanza facilmente la funzionalità fornita da JMP per mostrare gli script necessari per i passaggi per modificare questo processo manuale in un processo automatizzato (piccole modifiche dovrebbero essere apportate per renderlo più robusto).
E per le tue domande 1 e 3:
1. Dipende molto da come crei/apri/ottieni i tuoi datatable. Se hai sempre lo stesso nome, potresti fare riferimento a quello, ma non mi fiderei di questo a lungo termine poiché è così facile creare più datatable con lo stesso nome e JMP aggiungerà l'indicizzazione dopo i nomi. Ma a questi è possibile fare riferimento Datatable(nameofdatatable).
3. È possibile ottenere l'elenco delle tabelle dati con Ottieni elenco tabelle dati(). Passa sopra i datatable e chiudi quelli non necessari. Ma secondo me dovresti sempre chiudere il datatable che non ti servirà non appena possibile con Chiudi (riferimento a datatable, Nessun salvataggio).
Script di esempio per eseguire l'attività:
Names Default To Here(1);
//create example data and add reference to dt variable
dt = New Table("exampledata",
Add Rows(8),
Compress File When Saved(1),
New Column("ID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 2, 2, 2, 2])
),
New Column("SUB_ID",
Character,
"Nominal",
Set Values({"A", "A", "B", "B", "A", "A", "B", "B"})
),
New Column("HEIGHT",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([10, 11, ., 9, ., 12, 8, 12])
)
);
//note Link to original data table(0)
//dt_summary is reference to the new Summary table
dt_summary = dt << Summary(
Group(:ID, :SUB_ID),
N Missing(:HEIGHT),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Main Table Summary")
);
//close unnecessary datatable
Close(dt, no save);
//add new column with formula
dt_summary << New Column("Percent Missing",
Numeric,
"Continuous",
Format("Percent", 12, 0),
Formula(:Name("N Missing(HEIGHT)") / :"N Rows"),
);
//rename columns
Column(dt_summary, "N Rows") << Set Name("Total No of Rows");
Column(dt_summary, "N Missing(HEIGHT)") << Set Name("No of Rows with Missing Data");
Ri: JSL - Trova la % dei dati mancantiCIAO @rverma ,
Vedo che sei in grado di sfruttare Riepilogo all'interno delle tabelle.Posso produrre la maggior parte di ciò che stai facendo in quella sezione e quindi aggiungere una colonna con una formula per calcolare il rapporto (%).
Potrei creare lo script in questo modo che funzionerà comunque se non ci sono dati mancanti (aggiunge il punto 2):
sumdt = dt << Summary( Group( :ID, :SUB_ID ), N Missing( :HEIGHT ), Freq( "None" ), Weight( "None" ) );
sumdt << New Column( "Percent Missing",
Numeric,
Continuous,
Format( Percent ),
Formula( :"N Missing(HEIGHT)"n / :N Rows )
);
Quindi potresti creare un sottoinsieme su questo. E chiudi ancora le altre finestre.
È un inizio