JSL – % der fehlenden Daten ermittelnIch habe eine Datentabelle mit 3 Spalten

Ich muss eine Tabelle erstellen, die den Prozentsatz der fehlenden Daten in der HEIGHT-Spalte, gruppiert nach ID und SUB_ID, anzeigt. Im obigen Fall sollte das Ergebnis sein:

In einigen Fällen ist es jedoch möglich, dass keine Zeilen mit fehlenden Daten vorhanden sind. In diesem Fall sollte „Percent Missing“ 0 sein.

Ich brauche Hilfe beim Schreiben eines JSL-Skripts dafür. Ich freue mich über jede Anleitung. Ich habe drei Probleme in meinem Skript unten:
1. Wie kann ich den Handle/Verweis auf eine Datentabelle verfolgen, damit ich sie jederzeit abrufen kann? Ich habe am Anfang des Skripts immer „dt = CurrentDataTable“ verwendet. Aber nachdem ich einige Übersichtstabellen/Teilmengentabellen erstellt habe, verliere ich den Bezug zur Originaltabelle und weiß nicht, wie ich sie auf den neuesten Stand bringen kann.
2. Ich möchte, dass dies funktioniert, auch wenn keine Zeilen fehlen. Im Moment stoppt das Skript einfach mittendrin.
3. Ich muss alle Tische schließen, mit Ausnahme des Finaltisches mit fehlenden Prozentsätzen.
// 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 );Danke
Datenmischung und -bereinigungBetreff: JSL – % der fehlenden Daten ermittelnDanke für die Antwort. Ich wusste bisher nicht, dass man mit N Missing die fehlenden Datenzeilen finden kann. Dies hat die Arbeit erheblich erleichtert und einige Schritte im Skript reduziert.Betreff: JSL – % der fehlenden Daten ermittelnVielen Dank für die Schritt-für-Schritt-Erklärung. Schritt 1, 2 und 4 sind die neuen Tricks, die ich gelernt habe und die sehr hilfreich sind. Kein Wunder, warum mein Skript fehlschlug, wenn keine Daten fehlten. Ich werde daran denken, die Anweisung aufzuteilen, wenn ich mehrere Bedingungen anwende.Betreff: JSL – % der fehlenden Daten ermittelnVielen Dank für die einfache und kompakte Lösung. Es fügt zwar eine zusätzliche Spalte zur Originaltabelle hinzu, aber das ist für mich kein Problem.Betreff: JSL – % der fehlenden Daten ermittelnBITTE LESEN SIE NOCHMALS, falls Sie dies schon einmal gesehen haben. Da war ein Fehler.
Die Verwendung der in JMP integrierten Funktion Col N Missing ( ) vereinfacht diese Aufgabe. Ich werde 2 Ansätze zeigen.
LÖSUNG Nr. 1:
- Erstellen Sie in der ersten Tabelle eine Spalte, um die Vermissten nach Gruppe zu zählen.
- Fassen Sie die erste Tabelle zusammen.
- Ändern Sie den Namen der N-Zeilen-Spalte (falls gewünscht) und erstellen Sie eine Formelspalte für das Verhältnis.
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));
LÖSUNG Nr. 2:
- Erstellen Sie alle Formelspalten in der ersten Tabelle und erstellen Sie dann eine klare Zusammenfassung.
- Löschen Sie optional die Spalte „N Zeilen“ aus der Zusammenfassungstabelle.
** Das Problem bei dieser Methode liegt in der Funktion „Total Rows ( )“. Sie müssen das erste Argument mit einer „1“ beginnen, damit es als Dummy-Spalte dient, da das erste Argument nicht als Gruppierungsspalte verwendet werden kann. Lassen Sie die 1 weg, und Sie werden sehen, dass die Zählungen nur die Anzahl der Zeilen in der Gruppe „Typ“ widerspiegeln, nicht die Kombination aus Land und Typ.
Prost und Entschuldigung für den Fehler beim ersten Mal.
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));
Betreff: JSL – % der fehlenden Daten ermitteln- Sie müssen hinzufügen
Names Default To Here( 1 );
um die in Ihrem Skript angegebenen Variablen so zu begrenzen, dass sie nicht durch Variablen in anderen Skripten mit demselben Namen geändert werden, wodurch die Werte in Ihrem aktuellen Skript geändert werden
- Es scheint, dass Sie ein Missverständnis über die Funktion „Current Data Table()“ haben.Es kann auf zwei verschiedene Arten verwendet werden und hilft Ihnen dabei, den Bezug zu Ihrer ursprünglichen Datentabelle nicht zu verlieren.Die Spezifikation
dt = Current Data Table();
Sie haben es richtig verwendet.Und wenn Sie später in Ihrem Skript die ursprüngliche Datentabelle zur „aktuellen Datentabelle“ machen möchten, müssen Sie nur noch Folgendes tuncurrent data table(dt);
Dadurch wird JMP angewiesen, „dt“ als aktuelle Datentabelle zu verwenden.Was Sie jedoch unterlassen sollten, ist die Neuzuweisung von „dt“, indem Sie es auf der linken Seite eines „=“ platzieren.
- Manchmal ist es nicht sinnvoll, Aktionen in einer einzigen Anweisung zu kombinieren.Dein
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));erwartet, Zeilen auszuwählen und die Tabelle in einer Anweisung zu unterteilen.Das Problem ist, dass es Ihnen nicht das liefert, was Sie wollen, wenn keine Werte von :Height fehlen.In meiner Überarbeitung Ihres Skripts (unten) sind in der dt-Datentabelle die Zeilen ausgewählt oder nicht, und dann wird überprüft, ob fehlende Zeilen gefunden wurden, und wenn ja, dann und nur dann mit der Verarbeitung fortfahrendt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- Die Try()-Funktion ist sehr praktisch beim Ausführen von Funktionen, die möglicherweise fehlschlagen könnten, und wenn dies der Fall ist, möchten Sie nicht, dass die Ausführung des Skripts gestoppt wird.Die von Ihnen verwendeten Close()-Funktionen eignen sich hervorragend für die Verwendung der Try()-Funktion
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Ich hoffe, das ist hilfreich. Wenn Sie weitere Fragen haben, antworten Sie bitte
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 ) );
Betreff: JSL – % der fehlenden Daten ermitteln@jthi ,
Wir haben zur gleichen Zeit in die gleiche Richtung gedacht. Mir gefällt, dass Ihre Antwort etwas vollständiger ist als meine und ich stimme den Vorschlägen zu Punkt 1 und 3 zu.
Betreff: JSL – % der fehlenden Daten ermittelnZunächst empfehle ich dringend, den JMP-Skriptleitfaden zu lesen: JMP15-Skripthandbuch und Scripting Index finden Sie unter Jmp / Help / Scripting Index. Dies sind sehr gute Quellen für JSL-Skripting.
Für diese Aufgabe benötigen Sie kein JSL:
1. Beginnen wir mit der Beispieltabelle, die Sie uns mit zwei fehlenden Werten zur Verfügung gestellt haben
2. Erstellen Sie eine Zusammenfassung der Tabelle mit „N fehlt“, „Höhe“ als Statistik und „SUB_ID“ und „ID“ als Gruppe


3. Erstellen Sie eine neue Formel, indem Sie N Zeilen und N fehlende (HEIGHT) Spalten auswählen

4. Ändern Sie das Format in den Spalteneigenschaften in „Prozent“ und benennen Sie die Spalten nach Bedarf um
Basierend auf diesen Schritten könnten Sie auch relativ einfach die von JMP bereitgestellte Funktionalität verwenden, um Skripte anzuzeigen, die für Schritte zur Änderung dieses manuellen Prozesses in einen automatisierten Prozess erforderlich sind (es sollten kleine Änderungen vorgenommen werden, um ihn robuster zu machen).
Und zu deinen Fragen 1 und 3:
1. Es hängt stark davon ab, wie Sie Ihre Datentabellen erstellen/öffnen/abrufen. Wenn Sie immer denselben Namen haben, können Sie darauf verweisen, aber ich würde dem auf lange Sicht nicht vertrauen, da es so einfach ist, mehrere Datentabellen mit demselben Namen zu erstellen und JMP nach den Namen eine Indizierung hinzufügt. Aber diese können durch Datatable(nameofdatatable) referenziert werden.
3. Sie können eine Liste der Datentabellen mit Get Data Table List() abrufen. Durchlaufen Sie Datentabellen und schließen Sie unnötige. Aber meiner Meinung nach sollte man die Datentabelle, die man nicht benötigt, immer schließen, sobald es möglich ist, mit „Schließen“ (Referenz auf Datentabelle, kein Speichern).
Beispielskript zum Ausführen der Aufgabe:
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");
Betreff: JSL – % der fehlenden Daten ermittelnHallo @rverma ,
Ich sehe, dass Sie die Zusammenfassung in Tabellen nutzen können.Ich kann das meiste von dem, was Sie in diesem Abschnitt tun, wiedergeben und dann eine Spalte mit einer Formel hinzufügen, um das Verhältnis (%) zu berechnen.
Ich könnte das Skript so gestalten, dass es auch dann funktioniert, wenn keine Daten fehlen (ergänzt Punkt 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 )
);
Dann könnten Sie hierauf eine Teilmenge setzen. Und schließen Sie trotzdem die anderen Fenster.
Es ist ein Anfang