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的方式,使我的例子更加通用.
使用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
安全的一面.
我认为这可能是您要寻找的。我们在左侧:=
命名要更新的变量,在右侧命名有表达式,以用来更新相应的变量。
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)