Behalten Sie die Übereinstimmung der Spalten mit einer Liste bei, entfernen Sie den RestHallo -
Ich möchte Spalten (basierend auf Spaltennamen) aus einer Datentabelle entfernen, die dies tun nicht einer Liste entsprechen. Ich habe bisher den folgenden JSL-Code, aber er funktioniert nicht.
Eingabe geschätzt.
Names Default To Here( 1 );
bigClass = Open( "$SAMPLE_DATA/Big Class.JMP" );
dt = Current Data Table();
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names( String );
For(j = 1, j <= N Items( col_of_interest ), j++,
For( i = N Items( col_names ), i > 0, i--,
if ( not( col_names[i] == col_of_interest[j],
Remove From( col_names, i ))
);
);
);
dtNew = dt << subset( all rows, columns( col_names ) ); Wait( 0 );
Qualitäts- und VerfahrenstechnikWindowsBetreff: Spalten, die einer Liste entsprechen, beibehalten, den Rest entfernenTatsächlich wird JMP die Variable j und die Funktion J() nicht verwechseln, denn wenn Sie den Namen einer Funktion verwenden, müssen diesem die Klammern folgen, sonst wird er als etwas anderes definiert, beispielsweise als Variable if dieser Name existiert.
Aber ich nehme Ihre Warnung generell ernst, denn Namen sind in JSL wichtig!
Betreff: Spalten, die einer Liste entsprechen, beibehalten, den Rest entfernenEine weitere Option bei Verwendung von JMP 16:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.JMP" );
//list of columns to include
col_of_interest = {"name", "age", "weight", "does not exist"};
// Option 1 - subset table
// Filter out columns in the list that aren't in the table and subset
cols_checked = filter each({cn}, dt << Get Column Names( String ), n items(loc( col_of_interest, cn ))>0);
dtNew = dt << subset( all rows, columns( cols_checked ) );
// Option 2 - delete columns from original table
for each({c}, dt << get column references, if( n items( loc( col_of_interest, c << get name ) ) == 0, dt << delete columns(c) ) );Betreff: Spalten, die einer Liste entsprechen, beibehalten, den Rest entfernenVielen Dank für die Eingabe und den Tipp zur Matrixfunktion J, jthi. Lass es mich noch einmal versuchen.
Betreff: Spalten, die einer Liste entsprechen, beibehalten, den Rest entfernenWenn ich zwei Listen vergleiche, finde ich es einfacher, eine dritte Liste zu erstellen, die die Ergebnisse enthält, während die Schleifen durchgearbeitet werden, und dann die dritte Liste zu verwenden, um Maßnahmen zu ergreifen, wenn alle Schleifen abgeschlossen sind.Der folgende Code könnte das erreichen, was Sie versuchen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.JMP" );
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names( String );
col_list = {};
For( i = N Items( col_names ), i > 0, i--,
if(contains(col_of_interest, col_names[i]),
insert into(col_list, col_names[i])
);
);
dtNew = dt << subset( all rows, columns( col_list ) );
Wait( 0 );
Betreff: Spalten, die einer Liste entsprechen, beibehalten, den Rest entfernenIch würde alle Spalten in der Datentabelle durchlaufen und bei Bedarf entfernen (wenn Sie bei Ihrer Idee bleiben möchten, kann ich Ihnen auch beim Debuggen helfen):
Names Default To Here(1);
bigClass = Open("$SAMPLE_DATA/Big Class.JMP");
dt = Current Data Table();
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names(String);
For(i = 1, i <= N Items(col_names), i++,
If(!Contains(col_of_interest, col_names[i]),
dt << Delete Columns(col_names[i]);
);
);
Wait(0);Außerdem würde ich vorschlagen, J nicht als Variablennamen zu verwenden, da JMP eine Matrixfunktion J() hat.
Bearbeiten:
Es besteht auch keine Notwendigkeit, Current Data Table() zu verwenden (und das sollten Sie auch nicht), da Sie nach dem Öffnen der Tabelle bereits über die Referenz verfügen. Hier ist auch meine bevorzugte Methode zum Entfernen von Spalten (mithilfe eines assoziativen Arrays, um nur die zusätzlichen Spalten abzurufen und diese zu entfernen):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.JMP");
col_of_interest = {"name", "age", "weight"};
//get columns which are "extra"
col_names_aa = Associative Array(dt << Get Column Names(String));
col_names_aa << Remove(Associative Array(col_of_interest));
col_names_to_remove = col_names_aa << get keys;
Show(col_names_to_remove);
dt << Delete Columns(col_names_to_remove);