使用data.table重新编码变量

use*_*008 6 r recode data.table

我正在尝试使用data.table重新编码变量.我用谷歌搜索了近2个小时,但找不到答案.

假设我有一个data.table如下:

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

我想重新编码V1和V2.对于V1,我想将1s重新编码为0和2s为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"))
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在data.table中执行此操作

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"]
Run Code Online (Sandbox Code Playgroud)

以上是我认为最好的代码.但必须有一种更好,更有效的方法来做到这一点.


编辑

我改变了我想重新编码V2的方式,使我的例子更加通用.

Uwe*_*Uwe 9

使用data.table重新编码可以通过加入更新来解决:

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]
Run Code Online (Sandbox Code Playgroud)

转换DT

    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
Run Code Online (Sandbox Code Playgroud)

编辑:@Frank建议使用i.to安全的一面.


Mik*_* H. 7

我认为这可能是您要寻找的。我们在左侧:=命名要更新的变量,在右侧命名有表达式,以用来更新相应的变量。

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
Run Code Online (Sandbox Code Playgroud)

或者,只需recode在内使用data.table

library(dplyr)
DT[, c("V1","V2") := .(as.numeric(V1==2), recode(V2, "A" = "T", "B" = "K", "C" = "D"))]
Run Code Online (Sandbox Code Playgroud)