2012-07-05 4 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) 
같은
관련 문제