Преобразовать столбец фактора в несколько логических столбцов

r data.table

1372 просмотра

3 ответа

35224 Репутация автора

Приведенные данные выглядят так:

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-ish».

Есть ли лучший и / или более быстрый способ создания этих новых столбцов?

Автор: Justin Источник Размещён: 05.07.2012 06:41

Ответы (3)


9 плюса

16000 Репутация автора

Решение

Как насчет 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)]
Автор: BenBarnes Размещён: 05.07.2012 06:54

2 плюса

96820 Репутация автора

Существует также nnet::class.ind

library(nnet)

cbind(DT, setnames(as.data.table(DT[, class.ind(x)]),paste0('col', unique(DT$x))))
Автор: mnel Размещён: 05.07.2012 11:28

0 плюса

1 Репутация автора

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)
Автор: Gennady Khvorykh Размещён: 03.05.2016 03:15
Вопросы из категории :
32x32