Я хочу добавить много новых столбцов одновременно в data.table
на основе вычислений по группам. Рабочий пример моих данных будет выглядеть примерно так:
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
Теперь я хочу scale
и sum
использовать многие переменные, чтобы получить такой вывод:
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
Реализация моей проблемы с грубой силой будет следующей:
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]
Другие сообщения, описывающие подобную проблему (Добавить несколько столбцов в R data.table в один вызов функции? и Назначить несколько столбцы с использованием: = в data.table, по группе) предлагают следующее решение:
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]
Но опять-таки это будет очень грязно с множеством переменных, а также это приведет к сообщению об ошибке с scale
(но не с sum
, так как это не возвращает вектор).
Существует ли более эффективный способ достижения требуемого результата (имея в виду, что мой фактический набор данных довольно велик)?