2012-07-05 10 views
6

考えるデータを因子列に変換します。は、複数のブール値の列に次のようになります

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

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

をしかし、これはおそらくdata.table代替より遅い厄介なlapplyを使用して、このソリューションは非常に「data.tableっぽい」ではないとして私を打つ:

は、私はこのようにこれを行うことができます。

これらの新しい列を作成する方法はありますか?

+1

う何か '役に立つことmodel.matrix'などもありますか? 'model.matrix(〜cols-1)' – BenBarnes

答えて

8

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" 

どうやら、あなたは同じ結果を与えることが[.data.tablemodel.matrixを置くことができます。それは速くなるかどうかわからない:

DT[,model.matrix(~factor(x)-1)] 
+0

もちろん、ベースRからの回答があります...ありがとう! – Justin

2

nnet::class.ind

library(nnet) 

cbind(DT, setnames(as.data.table(DT[, class.ind(x)]),paste0('col', unique(DT$x)))) 
0
library(data.table) 
DT <- data.table(x=rep(1:5, 2)) 

# add column with id 
DT[, id := seq.int(nrow(DT))] 

# cast long table into wide 
DT.wide <- dcast(DT, id ~ x, value.var = "x", fill = 0, fun = function(x) 1) 
関連する問題