保持列與列表匹配,刪除其餘列你好 -
我想從數據表中刪除列(基於列名稱)不是匹配一個列表。 到目前為止,我有以下 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 );
質量和工藝工程視窗回复:保持列與列表匹配,刪除其餘列事實上,JMP 不會混淆變量 j 和函數 J(),因為當你使用函數名時,它後面必須跟括號,否則它會被限定為其他東西,就像變量 if這個名字是存在的。
但總的來說,我會認真對待你的警告,因為名字在 JSL 中很重要!
回复:保持列與列表匹配,刪除其餘列如果使用 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) ) );回复:保持列與列表匹配,刪除其餘列感謝您的輸入和關於矩陣函數 J、jthi 的提示。 讓我重試。
回复:保持列與列表匹配,刪除其餘列在比較兩個列表時,我發現更容易在循環中創建第三個列表來包含結果,然後在所有循環完成時使用第三個列表來執行操作。下面的代碼可以完成您正在嘗試的事情。
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 );
回复:保持列與列表匹配,刪除其餘列我將循環遍歷數據表中的所有列,並在需要時刪除(如果您想堅持自己的想法,我也可以幫助調試):
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);另外我建議不要使用 J 作為變量名,因為 JMP 有一個矩陣函數 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);