使用dplyr对数据表中的变量进行dummify

时间:2015-02-09 13:04:18

标签: r dplyr

我有一个包含大量数字变量的数据表。我希望以变量被虚拟变量替换的方式变换该表(如果变量大于零,则为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

我想将此表转换为类似的内容:

   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)}))

1 个答案:

答案 0 :(得分:3)

可以简单地执行“双重否定”(!!)并添加0以转换为二进制矩阵。第一个否定(!DT)为所有TRUE值提供0,留下其他值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)]

使用来自set的{​​{1}}的选项,可通过引用进行更新。所以,它会很有效率。

data.table