リストと一致する列を維持し、残りを削除こんにちは -
データテーブルから(列名に基づいて)列を削除したいと考えています。ないリストと一致します。 これまでのところ次のJSLコードがありますが、機能しません。
ご意見をお待ちしております。
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 );
品質およびプロセスエンジニアリングウィンドウズRe: リストと一致する列を保持し、残りを削除する実際のところ、JMP は変数 j と関数 J() を混同しません。関数の名前を使用するときは、その後ろに括弧を付ける必要があります。そうしないと、変数のような別のものとしてスコープが設定されます。その名前は存在します。
しかし、JSL では名前が重要なので、一般的にはあなたの警告を真剣に受け止めます。
Re: リストと一致する列を保持し、残りを削除する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) ) );Re: リストと一致する列を保持し、残りを削除するjthi さん、行列関数 J に関するご意見とヒントをありがとうございます。 再試行させてください。
Re: リストと一致する列を保持し、残りを削除する2 つのリストを比較する場合、ループの実行中に結果を含める 3 番目のリストを作成し、すべてのループが完了したときに 3 番目のリストを使用してアクションを実行する方が簡単であることがわかりました。以下のコードは、あなたが試みていることを達成する可能性があります。
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 );
Re: リストと一致する列を保持し、残りを削除するデータ テーブル内のすべての列をループし、必要に応じて削除します (アイデアを維持したい場合は、デバッグを手伝うこともできます)。
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);また、JMP には行列関数 J() があるため、変数名として J を使用しないことをお勧めします。
編集:
また、テーブルを開いた後はすでに参照があるため、Current Data Table() を使用する必要はありません (使用すべきではありません)。 また、列を削除するための私の推奨方法は次のとおりです(連想配列を使用して余分な列のみを取得し、それらを削除します)。
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);