N個のNULL行値を持つ列の削除各列が計測器で、各行が時間である値のテーブルがあります。 一部の機器では、意味のあるモデルに合わせるために十分な時間値でデータが記録されていません。
ループを使用して、各列を順番に循環し、値の数を確認できるようにしようとしています。
列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,
);
エラーメッセージには、引数が多すぎます。
ウィンドウズRe:N個のNull行値を持つ列を削除するこれを行うための多くの方法。 1つのオプションは、ColNumberまたはColN 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);
)
);Re:N個のNull行値を持つ列を削除する引数が多すぎる理由は、While()関数に2番目のコンマがあるためです。
While()関数の構造は次のとおりです。
While( testExpr, bodyExpr )
注:関数には2つの引数しかありません。テスト
i_loop <= N_loop
次に、textExprがtrueの場合に実行されるステートメント。bodyExprには、セミコロンではなく、各ステートメントの後にコンマがあります。したがって、各ステートメントを個別の引数にします。
カンマをセミコロンに変更してこのコードを実行しないでください。論理エラーがあり、コードを終了できません。i_loopとN_loopの値が変わることはありません。
列内の有効な値の数を確認するためのより高速な方法もあります。さらに、列を削除していて、N_loop値が固定されたままの場合、1つの列が削除されると、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;
);
PS @jthiソリューションはより良いソリューションです。あなたのアプローチは、いくつかの修正を加えて、うまくいきます.....とても良い仕事です!