2012-07-05 25 views
6

Verilen verileri bir faktör sütun dönüştürün.birden boole sütunlara benziyor

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

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

Ama muhtemelen data.table alternatif daha yavaş bir sinir bozucu lapply kullanır ve bu çözümler çok "data.table-imsi" değil gibi geliyor bana:

Böyle yapabilirsiniz.

Bu yeni sütunları oluşturmak için daha iyi ve/veya daha hızlı bir yol var mı?

+1

misiniz şey 'yararlı model.matrix'? model.matrix (~ cols-1) ' – BenBarnes

cevap

8

model.matrix nasıl olur?

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" 

Görünüşe göre, aynı sonuçları elde [.data.table içine model.matrix koyabilirsiniz. Değil daha hızlı olurdu emin:

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

Tabii ki R'den bir cevap var ... Teşekkürler! – Justin

2

da vardır 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) 
gibi