JSL - Finde% der fehlenden DatenIch habe eine Datentabelle mit 3 Spalten

Ich muss eine Tabelle erstellen, die% der fehlenden Daten in der Spalte HEIGHT zeigt, gruppiert nach ID und SUB_ID. 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. Ich werde jede Anleitung schätzen. Ich habe drei Probleme in meinem Skript unten:
1. Wie kann ich das Handle / den Verweis auf eine Datentabelle verfolgen, damit ich sie jederzeit abrufen kann? Ich habe immer "dt = CurrentDataTable" am Anfang des Skripts verwendet. Nachdem ich jedoch einige Übersichtstabellen / Teilmengen-Tabellen erstellt habe, verliere ich den Verweis auf die ursprüngliche Tabelle und weiß nicht, wie ich sie aktuell machen soll.
2. Ich brauche dies, um zu funktionieren, auch wenn keine Zeilen fehlen. Im Moment stoppt das Skript nur in der Mitte.
3. Ich brauche alle Tabellen zum Schließen, außer der Final Table mit Percent Missing.
// 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 );Vielen Dank
SkriptingBetreff: JSL - Finde% der fehlenden DatenHallo @verma ,
Ich sehe, dass Sie die Zusammenfassung in Tabellen nutzen können.Ich kann das meiste von dem, was Sie in diesem Abschnitt tun, produzieren und dann eine Spalte mit einer Formel hinzufügen, um das Verhältnis (%) zu berechnen.
Ich könnte das Skript so erstellen, dass es immer noch funktioniert, wenn keine Daten fehlen (Addessen 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 dies unterteilen. Und immer noch die anderen Fenster schließen.
Es ist ein Anfang
Betreff: JSL - Finde% der fehlenden DatenZuerst empfehle ich dringend, den JMP Scripting-Leitfaden zu lesen: JMP15 Scripting Guide und Scripting-Index aus Jmp / Help / Scripting-Index. Dies sind sehr gute Quellen für JSL-Skripte.
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 Missing with Height als Statistik und SUB_ID und ID als Gruppe


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

4. Ändern Sie das Format von Spalteneigenschaften in Prozent und benennen Sie die Spalten nach Bedarf um
Basierend auf diesen Schritten können Sie auch die von JMPs bereitgestellten Funktionen verwenden, um Skripts anzuzeigen, die für Schritte erforderlich sind, um diesen manuellen Prozess in einen automatisierten Prozess umzuwandeln (kleine Änderungen sollten vorgenommen werden, um ihn robuster zu machen).
Und für Ihre Fragen 1 & 3:
1. Es hängt sehr davon ab, wie Sie Ihre Datentabellen erstellen / öffnen / abrufen. Wenn Sie immer den gleichen 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. Auf diese kann jedoch von Datatable (nameofdatatable) verwiesen werden.
3. Mit Get Data Table List () können Sie eine Liste der Datentabellen abrufen. Durchlaufen Sie Datentabellen und schließen Sie unnötige. Aber meiner Meinung nach sollten Sie immer die Datentabelle schließen, die Sie nicht benötigen, sobald dies mit Close möglich ist (Verweis auf Datentabelle, kein Speichern).
Beispielskript zur Ausführung 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 - Finde% der fehlenden Daten@jthi ,
Wir haben zur gleichen Zeit in die gleiche Richtung gedacht. Ich finde es gut, dass Ihre Antwort etwas vollständiger ist als meine und den Vorschlägen von Punkt 1 und 3 zustimmt.
Betreff: JSL - Finde% der fehlenden Daten- Sie müssen hinzufügen
Names Default To Here( 1 );
Um zu begrenzen, dass die in Ihrem Skript angegebenen Variablen nicht durch Variablen in anderen Skripten mit demselben Namen geändert werden, ändern Sie die Werte in Ihrem aktuellen Skript
- 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 Verweis auf Ihre ursprüngliche Datentabelle nicht zu verlieren.Die Spezifikation
dt = Current Data Table();
Sie haben 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 etwas tuncurrent data table(dt);
Dadurch wird JMP angewiesen, "dt" als aktuelle Datentabelle zu verwenden.Was Sie unterlassen müssen, ist die Neuzuweisung von "dt", indem Sie es auf der linken Seite eines "=" platzieren.
- Manchmal ist es nicht gut, Aktionen in einer einzigen Anweisung zu kombinieren.Ihre
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 gibt, was Sie wollen, wenn keine Werte fehlen: Höhe.In meiner Überarbeitung Ihres Skripts (unten) wurden in der dt-Datentabelle die Zeilen ausgewählt oder nicht, und dann wird geprüft, ob fehlende Zeilen gefunden wurden, und wenn ja, dann und erst dann weiterdt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- Die Try () - Funktion ist sehr praktisch, um Funktionen auszuführen, die möglicherweise fehlschlagen könnten. Wenn dies der Fall ist, möchten Sie nicht, dass das Skript nicht mehr ausgeführt 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 zurück
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 findenBITTE LESEN SIE NOCHMAL, wenn Sie dies früher gesehen haben. Da war ein Fehler.
Die Verwendung der in JMP integrierten Funktion Col N Missing ( ) vereinfacht diese Aufgabe. Ich zeige 2 Ansätze.
LÖSUNG #1:
- Erstellen Sie eine Spalte, um fehlende Einträge nach Gruppe in der ersten Tabelle zu zählen.
- Fassen Sie die erste Tabelle zusammen.
- Ändern Sie den Namen der Spalte N Zeilen (wenn Sie möchten) 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 #2:
- Erstellen Sie alle Formelspalten in der ersten Tabelle und ziehen Sie dann eine direkte Zusammenfassung.
- Löschen Sie optional die Spalte N Zeilen aus der Übersichtstabelle.
** Der "Gotcha" in dieser Methode befindet sich in der Funktion Total Rows ( ). Sie müssen mit einer "1" für das erste Argument abschließen, um als Dummy-Spalte zu dienen, da das erste Argument nicht als Gruppierungsspalte verwendet werden kann. Lassen Sie die 1 weg, und Sie werden sehen, dass die Anzahl nur die Anzahl der Zeilen in der Gruppe "Typ" widerspiegelt, nicht die Kombination aus Land und Typ.
Cheers 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));