使用 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)
}
我有一个包含大量数字变量的数据 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)
}