保持列与列表匹配,删除其余列你好 -
我想从数据表中删除列(基于列名称)不是匹配一个列表。 到目前为止,我有以下 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);