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)?