将factor列转换为多个布尔列

Jus*_*tin 7 r data.table

给定的数据如下:

library(data.table)
DT <- data.table(x=rep(1:5, 2))
Run Code Online (Sandbox Code Playgroud)

我想将这些数据拆分为5个布尔列,指示每个数字的存在.

我可以这样做:

new.names <- sort(unique(DT$x))

DT[, paste0('col', new.names) := lapply(new.names, function(i) DT$x==i), with=FALSE]
Run Code Online (Sandbox Code Playgroud)

但是这使用了一个lapply比data.table替代方案慢的麻烦,这个解决方案让我觉得不是很"data.table-ish".

是否有更好和/或更快的方法来创建这些新列?

Ben*_*nes 9

怎么样model.matrix

model.matrix(~factor(x)-1,data=DT)

   factor(x)1 factor(x)2 factor(x)3 factor(x)4 factor(x)5
1           1          0          0          0          0
2           0          1          0          0          0
3           0          0          1          0          0
4           0          0          0          1          0
5           0          0          0          0          1
6           1          0          0          0          0
7           0          1          0          0          0
8           0          0          1          0          0
9           0          0          0          1          0
10          0          0          0          0          1
attr(,"assign")
[1] 1 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$`factor(x)`
[1] "contr.treatment"
Run Code Online (Sandbox Code Playgroud)

显然,你可以把model.matrix[.data.table给相同的结果.不确定它是否会更快:

DT[,model.matrix(~factor(x)-1)]
Run Code Online (Sandbox Code Playgroud)