给定的数据如下:
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".
是否有更好和/或更快的方法来创建这些新列?
怎么样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)
| 归档时间: |
|
| 查看次数: |
1378 次 |
| 最近记录: |