Как программно создать двоичные столбцы на основе категориальной переменной в data.table?
У меня большой (12 миллионов строк)data.table
который выглядит так:
library(data.table)
set.seed(123)
dt <- data.table(id=rep(1:3, each=5),y=sample(letters[1:5],15,replace = T))
> dt
id y
1: 1 b
2: 1 d
3: 1 c
4: 1 e
5: 1 e
6: 2 a
7: 2 c
8: 2 e
9: 2 c
10: 2 c
11: 3 e
12: 3 c
13: 3 d
14: 3 c
15: 3 a
Я хочу создать новыйdata.table
содержащий мою переменнуюid
(который будет уникальным ключом этого новогоdata.table
) и 5 других двоичных переменных, каждая из которых соответствует каждой категорииy
которые ценят1
если идентификатор имеет это значение дляy
, 0
иначе.
Выходdata.table
должен выглядеть так:
id a b c d e
1: 1 0 1 1 1 1
2: 2 1 0 1 0 1
3: 3 1 0 1 1 1
Я попытался сделать это в цикле, но это довольно медленно, и я также не знаю, как передать двоичные имена переменных программно, так как они зависят от переменной, которую я пытаюсь «разделить».
РЕДАКТИРОВАТЬ: как отметил @mtoto, на подобный вопрос уже задавали и отвечалиВот, но решение используетreshape2
пакет.
Мне было интересно, есть ли другой (более быстрый) способ сделать это, возможно, используя:=
оператор в data.table, так как у меня огромный массив данных, и я довольно много работаю с этим пакетом.
EDIT2: бенчмарк функций в посте @ Аруна по моим данным (~ 12 миллионов строк, ~ 3,5 миллиона различных идентификаторов и 490 различных меток дляy
переменная (в результате получается 490 фиктивных переменных)):
system.time(ans1 <- AnsFunction()) # 194s
system.time(ans2 <- dcastFunction()) # 55s
system.time(ans3 <- TableFunction()) # Takes forever and blocked my PC