2017-06-16 5 views
2

data.tableを使用して変数を再コードしようとしています。私は約2時間のためにグーグルを行ったが、答えを見つけることができませんでした。data.tableを使用して変数を再コードする

は、私は、次のようdata.tableがあるとします。

DT <- data.table(V1=c(0L,1L,2L), 
       V2=LETTERS[1:3], 
       V4=1:12) 

私はV1とV2を再コーディングします。 V1については、1と0を、2を1に再コードしたい。 V2では、AからT、BからK、CからDにコードを変更したい。

dplyrを使用すると簡単です。

library(dplyr) 
DT %>% 
    mutate(V1 = recode(V1, `1` = 0L, `2` = 1L)) %>% 
    mutate(V2 = recode(V2, A = "T", B = "K", C = "D")) 

は、しかし、私は上記の私が私の最高のように考えることができるコードがどのように

DT[V1==1, V1 := 0] 
DT[V1==2, V1 := 1] 
DT[V2=="A", V2 := "T"] 
DT[V2=="B", V2 := "K"] 
DT[V2=="C", V2 := "D"] 

data.table

でこれを行うには考えています。しかし、これを行うにはより良い方法と効率的な方法が必要です。


編集

私は私の例では、より一般的にするためにV2を再コーディングする方法を変更しました。

+0

'' C''を '' D '''に変更したいので、あなたの 'V2'は文字でなければならないと思いますか?私はあなたが 'V2'をコード化する方法について正確に間違っているかもしれませんが、 –

+0

@MikeH。はい、「V2」はおそらく文字でなければなりません。 – user3077008

答えて

4

これはあなたが探しているかもしれないと思います。 :=の左側には、更新する変数の名前を付け、右側には対応する変数を更新する式があります。

DT[, c("V1","V2") := .(as.numeric(V1==2), sapply(V2, function(x) {if(x=="A") "T" 
                else if (x=="B") "K" 
                else if (x=="C") "D" }))] 

# V1 V2 V4 
#1: 0 T 1 
#2: 0 K 2 
#3: 1 D 3 
#4: 0 T 4 
#5: 0 K 5 
#6: 1 D 6 
#7: 0 T 7 
#8: 0 K 8 
#9: 1 D 9 
#10: 0 T 10 
#11: 0 K 11 
#12: 1 D 12 

あるいは、単にdata.tablerecodeを使用:data.table

library(dplyr) 
DT[, c("V1","V2") := .(as.numeric(V1==2), recode(V2, "A" = "T", "B" = "K", "C" = "D"))] 
+0

ありがとうございました!私は 'dplyr'の' recode'に相当するdata.tableを見つけようとしていました。そこで、私の例をより一般的なケースに変更しました。 – user3077008

+1

'data.table'に' recode'のような特定の関数があるかどうかわかりません。しかし、あなたは 'data.table'の中で' DT [、c( "V1"、 "V2"):=。(as.numeric(V1 == 2)、recode(V2、 "A" –

+1

また、 'sapply'のような他の関数を使うこともできます:DT [、c(" V1 "、" V2 "、" T "、" B "=" K "、" C " (x == "A") "T" else if(x == "B") "K" else if(x == "C") "D" }))] –

4

をリコード参加にアップデートで解決することができる。

DTに変換
DT[.(V1 = 1:2, to = 0:1), on = "V1", V1 := i.to] 
DT[.(V2 = LETTERS[1:3], to = c("T", "K", "D")), on = "V2", V2 := i.to] 

V1 V2 V4 
1: 0 T 1 
2: 0 K 2 
3: 1 D 3 
4: 0 T 4 
5: 0 K 5 
6: 1 D 6 
7: 0 T 7 
8: 0 K 8 
9: 1 D 9 
10: 0 T 10 
11: 0 K 11 
12: 1 D 12 

を編集してください:@Frankは、i.toを安全な側にすることをお勧めします。

関連する問題