刪除具有 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_loop ),
);
i_temp+=1,
);
錯誤消息說參數太多。
視窗回复:刪除具有 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解決方案是更好的解決方案。您的方法經過一些更正後確實有效……幹得好!
回复:刪除具有 N 個空行值的列有很多方法可以做到這一點。 一種選擇是使用 Col Number 或 Col N Missing 和 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);
)
);