Fügen Sie einer data.table, die viele Variablen enthält, neue Spalten hinzu

Ich möchte gleichzeitig viele neue Spalten zu einem hinzufügendata.table basierend auf Gruppenberechnungen. Ein funktionierendes Beispiel meiner Daten würde ungefähr so aussehen:

     Time     Stock x1 x2 x3
1: 2014-08-22     A 15 27 34
2: 2014-08-23     A 39 44 29
3: 2014-08-24     A 20 50  5
4: 2014-08-22     B 42 22 43
5: 2014-08-23     B 44 45 12
6: 2014-08-24     B  3 21  2

Jetzt möchte ichscale undsum viele der Variablen, um eine Ausgabe zu erhalten, wie:

         Time Stock x1 x2 x3   x2_scale   x3_scale x2_sum x3_sum
1: 2014-08-22     A 15 27 34 -1.1175975  0.7310560    121     68
2: 2014-08-23     A 39 44 29  0.3073393  0.4085313    121     68
3: 2014-08-24     A 20 50  5  0.8102582 -1.1395873    121     68
4: 2014-08-22     B 42 22 43 -0.5401315  1.1226726     88     57
5: 2014-08-23     B 44 45 12  1.1539172 -0.3274462     88     57
6: 2014-08-24     B  3 21  2 -0.6137858 -0.7952265     88     57

Eine Brute-Force-Implementierung meines Problems wäre:

library(data.table)

set.seed(123)
d <- data.table(Time = rep(seq.Date( Sys.Date(), length=3, by="day" )),
                Stock = rep(LETTERS[1:2], each=3 ),
                x1 = sample(1:50, 6),
                x2 = sample(1:50, 6),
                x3 = sample(1:50, 6))

d[,x2_scale:=scale(x2),by=Stock]
d[,x3_scale:=scale(x3),by=Stock]
d[,x2_sum:=sum(x2),by=Stock]
d[,x3_sum:=sum(x3),by=Stock]

Andere Posts, die ein ähnliches Problem beschreiben (Mehrere Spalten zu R data.table in einem Funktionsaufruf hinzufügen? undOrdnen Sie mehrere Spalten mit: = in data.table nach Gruppe zu) schlagen folgende Lösung vor:

  d[, c("x2_scale","x3_scale"):=list(scale(x2),scale(x3)), by=Stock]
  d[, c("x2_sum","x3_sum"):=list(sum(x2),sum(x3)), by=Stock]

Aber auch dies würde mit vielen Variablen sehr chaotisch werden und auch dies bringt eine Fehlermeldung mit sichscale (aber nicht mitsum da dies keinen Vektor zurückgibt).

Gibt es einen effizienteren Weg, um das gewünschte Ergebnis zu erzielen (wenn ich bedenke, dass mein tatsächlicher Datensatz ziemlich groß ist)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage