2012-07-05 13 views
6

z danych, które wygląda następująco:Konwersja kolumnę czynnika do wielu kolumn logicznych

library(data.table) 
DT <- data.table(x=rep(1:5, 2)) 

chciałbym podzielić te dane na 5 kolumn logicznych, które wskazują na obecność każdego numeru.

można zrobić to tak:

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

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

Ale ta wykorzystuje brzydkie lapply który jest prawdopodobnie wolniej niż data.table alternatywa i rozwiązanie to wydaje mi się nie bardzo „data.table-owski”.

Czy istnieje lepszy i/lub szybszy sposób tworzenia nowych kolumn?

+1

Byłoby coś 'model.matrix' być pomocne? 'model.matrix (~ cols-1)' – BenBarnes

Odpowiedz

8

Co powiecie na 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" 

Podobno można umieścić model.matrix do [.data.table dać takie same wyniki. Nie wiem, czy to będzie szybciej:

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

Oczywiście jest odpowiedź z bazy R ... Dzięki! – Justin

2

Istnieje również 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) 
Powiązane problemy