Точно так же как название говорит - у меня есть следующие данные стиля:Добавить таблицу данных. Таблица суммирует строку через цепочку вместо rbindlist?
library(data.table)
DT = data.table(name =LETTERS[seq(from = 1, to = 10)],x=seq(from=1,to=10),y=seq(from=11,to=20),z=seq(from=21,to=30))
setkey(DT,name)
DT[, `:=`(xy = x/y, xz = x/z, yz = y/z)][,
c(name = "Total", lapply(.SD, sum), lapply(.SD2, mean)), list(.SDcols=2:4,.SD2cols=5:7)][,
rbind(DT, .SD)]
name x y z xy xz yz
1: A 1 11 21 0.09090909 0.04761905 0.5238095
2: B 2 12 22 0.16666667 0.09090909 0.5454545
3: C 3 13 23 0.23076923 0.13043478 0.5652174
4: D 4 14 24 0.28571429 0.16666667 0.5833333
5: E 5 15 25 0.33333333 0.20000000 0.6000000
6: F 6 16 26 0.37500000 0.23076923 0.6153846
7: G 7 17 27 0.41176471 0.25925926 0.6296296
8: H 8 18 28 0.44444444 0.28571429 0.6428571
9: I 9 19 29 0.47368421 0.31034483 0.6551724
10: J 10 20 30 0.50000000 0.33333333 0.6666667
Я видел, что это было бы возможно создать вектор, как,
DT["Total" ,] <- c(colSums(DT[2:4]),colMeans(DT[5]))
или использовать rbindlist
, однако Меня особенно интересует возможность завершить это путем цепочки. Можно ли это сделать с помощью нескольких функций .SDcol
, как я перефразировал выше?
Я не знаю, что вы подразумеваете под цепью, но «DT [, c (name =« Total », lapply (.SD, sum), xy = mean (xy)), .SDcols = x: z] [, rbind (DT, .SD)] работает только чуть-чуть. – Frank
вопрос в том, почему вы хотите это сделать? Почему бы просто не использовать 'margin.table'? – MichaelChirico
@Frank - это прекрасно. Именно то, что я искал. И цепочка, как и в вас, может добавить это сразу же после предыдущего блока данных 'data.table' и работает непрерывно. (т. е. DT [, xy: = x/y] [, c (name = "Total", lapply (.SD, sum), xy = mean (xy)), .SDcols = x: z] [, rbind (DT, .SD)] ' @MichaelChirico - Я рассматривал поля, но мне не нужны сводки строк, просто сводки столбцов. Мне нужно немного исследовать, но возможно ли использовать средства/etc с расчетами полей ? – gscott