Löschen Sie leere Zeilen für alle Spalten einer ListeGelöst: Betreff: Zeilen mit einem oder mehreren leeren Werten mit JSL entfernen - Seite 2 - JMP User Community
Basierend auf der obigen Diskussion habe ich ein Skript zum Löschen leerer Zeilen, aber es scheint diejenigen zu löschen, bei denen sie in IRGENDEINER der aufgelisteten Spalten leer sind, während ich diejenigen löschen möchte, bei denen ALLE aufgelisteten Spalten leer sind.
Danke
// 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;
Automatisierung und SkriptingBetreff: Löschen Sie leere Zeilen für alle Spalten einer ListeHaben Sie sich ausreichend mit der JSL beschäftigt, um zu verstehen, warum sie nicht das tut, was Sie brauchen?
Werfen Sie einen Blick in den Scripting Guide zu Select Where
Sie müssen alle Zeilen finden, die fehlende Werte für die erste Spalte in Datacols aufweisen. Wählen Sie dann aus dieser Zeilenliste die Zeilen aus, die fehlende Werte für die zweite Spalte aufweisen, dann die dritte usw., bis Sie die letzte Spalte in der Datacols-Liste erreichen.
Die Zeilen, die danach übrig bleiben, sind nur die Zeilen mit fehlenden Werten für alle Spalten in Datacols.
Dann müssen Sie nur noch die verbleibenden Zeilen löschen.
Sehen Sie sich das Element „Current Selection()“ der Funktion „Select Where()“ an. Dadurch wird jedes nachfolgende „Select Where“ so eingeschränkt, dass beim Anwenden der Auswahl nur die zuvor ausgewählten Zeilen berücksichtigt werden.
Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeJim
Ich glaube, ich verstehe es. Es war zum Scheitern verurteilt. Deine Idee ist jedoch gut! So sieht sie aus.
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;Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeFunktioniert das? Ich verstehe nicht, wie das funktionieren soll. Sie behandeln jede Spalte unabhängig voneinander. Sie setzen die vollständigen Zeilen für jede Spalte zurück.
Hier ist ein Beispiel für die Verwendung von Mehrfachauswahl where()_um die Zeilen einzugrenzen, die Sie auswählen möchten
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"));Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeIch bin nicht ganz sicher, was in Ihrem ersten Teil des Skripts vor sich geht oder wie es mit dieser Frage zusammenhängt (um eine Liste der Spalten zu erstellen?), aber Sie können Folgendes tun: Verwenden Sie die JMP-Plattform (fehlendes Datenmuster), wählen Sie aus, wo (wie Jim vorgeschlagen hat) oder beispielsweise mit Datentabellen-Indizierung + Schleife / Datentabellen-Indizierung + einigen Matrixoperationen.
Ich würde es zunächst mit der Missing-Data-Plattform von JMP versuchen. Prüfen Sie, ob sie dafür geeignet ist (sie ist es). Sehen Sie sich anschließend die von Jim vorgeschlagene Option „Select Where“ an. Nachdem Sie das Skript erstellt und Jims Vorschlag verstanden haben, können Sie sich die unten vorgeschlagenen Abonnementoptionen für Datentabellen ansehen, falls Sie noch Interesse haben.
Fehlendes Datenmuster
Verwenden von JMP > Eingeben und Bearbeiten Ihrer Daten > Organisieren von Daten in Datentabellen > Anzeigen von Mustern fehlender Daten in Datentabellen
Skripthandbuch > Datentabellen > Erweitertes Datentabellen-Skripting > Fehlende Datenmuster finden


Dabei werden Matrixoperationen verwendet und ich denke, es sollte funktionieren
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
Dies würde eine Schleife über die Zeilen durchführen und dabei auf fehlende Werte prüfen
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);
Betreff: Löschen Sie leere Zeilen für alle Spalten einer Listefehlt (Liste) und fehlt (Matrix)
schön! – und unerwartet.


gibt es eine allgemeine Übersicht, welche JSL-Funktionen „vektorisiert“ werden können?
Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeIch dachte, das Skript funktioniert, aber es hat einen Fehler, wie Sie anmerken. Ich habe @Jarmos Idee ausprobiert und sie funktioniert, aber die Matrix wird bei mir nicht ausgefüllt.
// 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
Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeEnthalten Ihre Datenspalten das, wonach Sie suchen? Außerdem müssen Sie die 2 an Ihre Daten anpassen, dynamische Optionen wie
rows_to_delete = Loc(V Sum(m`) == N Items(cols_to_check));
könnte eine gute Idee sein
Betreff: Löschen Sie leere Zeilen für alle Spalten einer ListeJarmo
Das hat geklappt. Ich habe mich tatsächlich über die Bedeutung der 2 gewundert.
Danke