2017-02-09 11 views
1

特定の列をNAに設定しようとしています。例:data.tableのNAに列を最も効果的に設定するにはどうすればよいですか?

DT2 <- data.table(Id = rep(c(1,2,3),each = 20), 
       x1 = rnorm(20), 
       x2 = rnorm(20), 
       x3 = c(NA,NA,rnorm(18))) 
DT2[,2] <- NA # sets the second column NA 

驚くべきことに、DT2[,c(F,T,F,F)] <- NAはこのケースでは動作しません、一つはwhichを使用する必要があります。 しかし、多くの列をインデックスでNAに設定すると、大きなデータテーブルでは上記の処理が遅くなるようです。より良い方法があるのだろうか、おそらくsetを使っているのだろうか? ヒントありがとう!

+0

「datatable」はあいまいです。どの言語/ DBMSで作業していますか? – Tim

+0

カラム名を使用し、 'DT2 [、x1:= NA]'という参照で代入することが最善の方法です。インデックスを使用すると、間違いが起きやすくなります。誤って間違ったインデックスを使用するとどうなりますか? –

+0

しかし、条件の列を削除するとどうなりますか?だから、基本的に私は削除する列のインデックスを持っています。データフレームは非常に簡単です: 'df [、ind] < - NA'。 – user3032689

答えて

0

(それは、小さなデータセットを実際に高速です)速度を上げるには:=を使用する必要があります。上記の例では:

DT[, (c(2,3)) := NA] 
0

列の位置を使用して値を更新することはできますが、列の順序が変更されると問題を回避するために列名を使用してコードを作成する方が一般的に適しています。フランクが指摘したように、あなたがdata.frame構文を使用したい場合は名前

library(data.table) 

DT2[, x1 := NA] 
DT2[, c("x1", "x3") := NA] 

によって、単一の列または複数のいずれかのすべての値を設定する方法を示しは

DT2[, "x1"] <- NA 
DT2[, c("x1", "x3")] <- NA 
+0

私はcolnamesの使い方を知っていますが、ランダムな名前のパターンを持つ何千もの列がある場合、どのように条件をテストするときに名前を知っていると思いますか?列あたり非ナンバーの一定量を考えてみましょう。私が知っている唯一の方法は、名前の代わりにcolindicesを使うことです。 – user3032689

+0

インデックスを返すように列をテストする場合は、順序に関係なく正しい列が選択されるため、問題はありません。その問題は、問題を引き起こす可能性のある列番号をハードコーディングしているように見えます。 – manotheshark

関連する問題