使用 dplyr 虚拟化数据 table 中的变量

dummify variables in data table with dplyr

我有一个包含大量数字变量的数据 table。我想以变量替换为虚拟变量的方式转换此 table(如果变量大于零,则为 1)。

library(data.table)
DT <- data.table(replicate(5,sample(0:3,5,replace=TRUE)))
DT
   V1 V2 V3 V4 V5
1:  3  3  0  3  2
2:  0  2  3  0  1
3:  2  1  3  2  0
4:  3  1  1  1  3
5:  0  2  0  2  3

我想将此 table 转换为如下内容:

   V1 V2 V3 V4 V5
1:  1  1  0  1  1
2:  0  1  1  0  1
3:  1  1  1  1  0
4:  1  1  1  1  1
5:  0  1  0  1  1

有什么方法可以用 dplyr 实现吗?我尝试了 mutate_each 但无法弄清楚如何在 mutate 中使用我自己的函数。以下解决方案不起作用。

DT <- DT %>%
  mutate_each(funs(function(x) {as.numeric(x>0)}))

可以简单地执行 "double negation" (!!) 并添加 0 以转换为二进制矩阵。第一个否定 (!DT) 对所有 0 值给出 TRUE,留下其他值 FALSE。再次否定以将 FALSE 更改为 TRUE 并添加 0 将逻辑矩阵强制转换为二进制矩阵。

(!!DT) + 0L

或使用dplyr

library(dplyr)
tbl_df(DT) %>% mutate_each(funs((!!.) + 0L))

或者只使用 data.table(您已经在使用)通过引用更新您的列

DT[, names(DT) := lapply(.SD, function(x) (!!x) + 0L)]

或使用 data.table 中的 set 的选项,通过引用更新。所以,它会很有效。

 for(j in seq_len(ncol(DT))){
   set(DT, i=NULL, j=j, value=(!!DT[[j]])+0L)
  }