2016-07-06 11 views
4

条件付きでdata.table内のすべての値をどのように置き換えますか?条件が与えられたdata.table内のすべての値を置き換えます。

私は

ppp[,ifelse(.SD==6,NA,.SD)] 

のようなものを試してみたが、それは動作しませんNA

A B C D 
1 NA 1 3 
2 5 2 4 
3 4 3 5 
4 3 4 NA 
5 2 5 7 
NA 1 6 8 

により、すべての "6" に置換する例

ppp <- data.table(A=1:6,B=6:1,C=1:6,D=3:8) 

A B C D 
1 6 1 3 
2 5 2 4 
3 4 3 5 
4 3 4 6 
5 2 5 7 
6 1 6 8 

については

、はるかに広いテーブルを生成します。

+0

これはあなたが行う必要があることの場合は、おそらくマトリックスを使用する必要があります。 – Frank

答えて

8

ネイティブdata.tableの方法は、次のようになります。

for(col in names(ppp)) set(ppp, i=which(ppp[[col]]==6), j=col, value=NA) 
# Test 
> ppp 
    A B C D 
1: 1 NA 1 3 
2: 2 5 2 4 
3: 3 4 3 5 
4: 4 3 4 NA 
5: 5 2 5 7 
6: NA 1 NA 8 

このアプローチ - おそらくもっと冗長ではあるが、それでもよりもはるかに高速になるだろうは、すべての列のコピーを避けるためです。

+0

ニース。明示的にそれを書くことはありませんか? – skan

+1

列をループする必要があります。 – mtoto

+0

単一の数字(「6」など)の代わりに、異なる列の異なる数字を持つベクトルを使用した場合はどうなりますか。例えば、私は列c(2,5,6,9,11,111)をc(== 6、> 1、> 0、== 21、== 2)と比較しなければならないと言う。 – skan

4

も簡単:

ppp[ppp == 6] <- NA 

ppp 
    A B C D 
1: 1 NA 1 3 
2: 2 5 2 4 
3: 3 4 3 5 
4: 4 3 4 NA 
5: 5 2 5 7 
6: NA 1 NA 8 

重要なのは、これはそのクラスを変更しません。これを行うには

is.data.table(ppp) 
[1] TRUE 
+2

is.na(ppp)< - ppp == 6' – Frank

+0

ありがとうございます。私はちょうど昨日それを使用しましたが、悪い習慣に落ちるようです。 – lmo

+0

とにかく括弧の中からNAを割り当てる? data.tableの例を見ると、大括弧で囲まれたものはすべてdata.tableで処理され、外部で実行される操作よりも高速です。 – skan

関連する問題