Wie programmgesteuert binäre Spalten basierend auf einer kategorialen Variablen in data.table erstellen?
Ich habe eine große (12 Millionen Zeilen)data.table
was so aussieht:
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
Ich möchte ein neues @ erstelldata.table
enthält meine Variableid
(das wird der eindeutige Schlüssel dieses neuen @ sedata.table
) und 5 weitere Binärvariablen, von denen jede einer Kategorie von @ entspricy
welche Wert nehmen1
wenn die ID diesen Wert für @ hy
, 0
Andernfalls
Die Ausgabedata.table
sollte so aussehen:
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
Ich habe versucht, dies in einer Schleife zu tun, aber es ist ziemlich langsam und ich weiß auch nicht, wie ich die binären Variablennamen programmgesteuert übergeben soll, da sie von der Variablen abhängen, die ich zu "teilen" versuche.
BEARBEITE: wie @mtoto betonte, wurde eine ähnliche Frage bereits gestellt und beantwortetHie, aber die Lösung verwendet dasreshape2
package.
Ich habe mich gefragt, ob es einen anderen (schnelleren) Weg gibt, dies zu tun, indem ich vielleicht das @ benutz:=
Operator in data.table, da ich einen riesigen Datensatz habe und ziemlich viel mit diesem Paket arbeite.
EDIT2: Benchmark der Funktionen in @ Aruns Beitrag auf meinen Daten (~ 12 Millionen Zeilen, ~ 3,5 Millionen verschiedene IDs und 490 verschiedene Labels für dasy
Variable (ergibt 490 Dummy-Variablen):
system.time(ans1 <- AnsFunction()) # 194s
system.time(ans2 <- dcastFunction()) # 55s
system.time(ans3 <- TableFunction()) # Takes forever and blocked my PC