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