Löschen von Spalten mit N Null-ZeilenwertenIch habe eine Wertetabelle, in der jede Spalte ein Instrument und jede Zeile eine Zeit ist. Bei einigen Instrumenten wurden die Daten nicht zu genügend Zeitwerten aufgezeichnet, um ein aussagekräftiges Modell zu erstellen.
Ich versuche, eine Schleife zu verwenden, damit ich jede Spalte nacheinander durchlaufen und die Anzahl der Werte überprüfen kann.
Ich habe einen Code, der die Anzahl der Werte für Spalte 80 findet.
col_a = Column(dt_2, 80);
val_mat = col_a << Get Values;
y = sum(!is missing(val_mat));
Ich versuche, diesen Code für jede Spalte der Reihe nach in eine Schleife anzupassen und Spalten mit zu wenigen Werten zu löschen.
N_loop = N Cols(dt_2);
i_loop = 2;
While (i_loop <= N_loop,
col_loop = Column(dt_2, i_loop),
val_loop = col_loop << Get Values,
y_loop = sum(!is missing(val_loop)),
If(y_loop <= 8,
dt_2 << Delete Columns( i_loop ),
);
i_temp+=1,
);
Die Fehlermeldung sagt zu viele Argumente.
FensterBetreff: Löschen von Spalten mit N Null-ZeilenwertenDer Grund für zu viele Argumente ist, dass die While()-Funktion ein zweites Komma enthält.
Die Struktur einer While()-Funktion ist
While( testExpr, bodyExpr )
Hinweis: Es gibt nur 2 Argumente für die Funktion.Der Test
i_loop <= N_loop
und dann die Anweisungen, die ausgeführt werden, wenn der Textausdruck wahr ist.Ihr bodyExpr hat nach jeder Anweisung Kommas anstelle von Semikolons.So wird jede Aussage zu einem separaten Argument.
Bitte ändern Sie nicht einfach die Kommas in Semikolons und führen Sie diesen Code aus.Es gibt einen logischen Fehler, der es dem Code unmöglich macht, jemals zu enden.i_loop und N_loop ändern nie ihren Wert.
Es gibt auch eine schnellere Möglichkeit, die Anzahl gültiger Werte in einer Spalte zu überprüfen.Wenn Sie außerdem Spalten löschen und Ihr N_loop-Wert fest bleibt, entspricht N_loop nicht mehr der korrekten Anzahl von Spalten in der Datentabelle, sobald eine Spalte gelöscht wird.Arbeiten Sie in solchen Fällen am besten von der letzten Spalte zur ersten Spalte.
Unten ist eine Überarbeitung Ihres Skripts, die die Spalten löscht, in denen die Anzahl gültiger Datenwerte kleiner oder gleich 8 ist.
Names Default To Here( 1 );
dt_2 = Current Data Table();
N_loop = N Cols( dt_2 );
i_loop = 2;
While( N_loop > i_loop,
If( Col Number( As Column( dt_2, N_loop ) ) <= 8,
dt_2 << Delete Columns( N_loop )
);
N_loop -= 1;
);
PS @jthi Lösung ist eine bessere Lösung.Ihr Ansatz funktioniert mit einigen Korrekturen ... so gute Arbeit!
Betreff: Löschen von Spalten mit N Null-ZeilenwertenViele Möglichkeiten, dies zu tun. Eine Option ist die Verwendung von Col Number oder Col N Missing und For Each (erfordert JMP16)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//delete some values
dt[1::20, "name"] = "";
dt[1::30, "sex"] = "";
dt[1::40, "height"] = .;
wait(2);
row_count = N Rows(dt);
For Each({col_name}, dt << Get Column Names("String"),
// missing_vals = Col N Missing(Column(dt, col_name));
// found_values = row_count - missing_vals;
found_values = Col Number(Column(dt, col_name));
If(found_values <= 8,
dt << Delete Column(col_name);
)
);