7

次のようなデータが与えられた場合:

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

このデータを、各数値の存在を示す 5 つのブール列に分割したいと思います。

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

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

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

しかし、lapplyこれはおそらくdata.tableの代替手段よりも遅い厄介なものを使用しており、このソリューションはあまり「data.tableっぽい」とは言えません。

これらの新しい列を作成するためのより良い方法やより高速な方法はありますか?

4

3 に答える 3

9

どう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"

どうやら、同じ結果を得るためmodel.matrixにを入れることができます。[.data.tableそれがより速いかどうかわからない:

DT[,model.matrix(~factor(x)-1)]
于 2012-07-05T18:54:03.583 に答える
2

もありますnnet::class.ind

library(nnet)

cbind(DT, setnames(as.data.table(DT[, class.ind(x)]),paste0('col', unique(DT$x))))
于 2012-07-05T23:28:04.560 に答える