删除具有 N 个空行值的列我有一个值表,每列是一个工具,每一行是一个时间。 有些仪器没有足够的时间值记录数据,以便我拟合一个有意义的模型。
我正在尝试使用循环让我依次循环浏览每一列并检查值的数量。
我有一些代码可以找到第 80 列的值的数量。
col_a = Column(dt_2, 80);
val_mat = col_a << Get Values;
y = sum(!is missing(val_mat));
我正在尝试将此代码依次调整为每一列的循环,并删除值太少的列。
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_temp ),
);
i_temp+=1,
);
错误消息说参数太多。
视窗回复:删除具有 N 个空行值的列有很多方法可以做到这一点。 一种选择是使用 Col Number 或 Col N Missing and For Each(需要 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);
)
);回复:删除具有 N 个空行值的列参数太多的原因是,While() 函数中有第二个逗号。
While() 函数的结构是
While( testExpr, bodyExpr )
注意:该函数只有 2 个参数。考试
i_loop <= N_loop
然后是如果 textExpr 为真则执行的语句。您的 bodyExpr 在每个语句后都有逗号,而不是分号。因此,使每个陈述成为一个单独的论点。
请不要只将逗号更改为分号并运行此代码。有一个逻辑错误,这将不允许代码结束。i_loop 和 N_loop 的值永远不会改变。
还有一种更快的方法来检查列中有效值的数量。此外,如果您正在删除列,并且您的 N_loop 值保持固定,则一旦删除一列,N_loop 就不再是数据表中正确的列数。在这种情况下,最好从最后一列到第一列。
下面是您的脚本的返工,它将删除有效数据值数量小于或等于 8 的列。
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;
);
附言@jthi解决方案是更好的解决方案。你的方法,经过一些修正,确实有效……干得好!