2017-02-21 30 views
0

Точно так же как название говорит - у меня есть следующие данные стиля:Добавить таблицу данных. Таблица суммирует строку через цепочку вместо 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, как я перефразировал выше?

+0

Я не знаю, что вы подразумеваете под цепью, но «DT [, c (name =« Total », lapply (.SD, sum), xy = mean (xy)), .SDcols = x: z] [, rbind (DT, .SD)] работает только чуть-чуть. – Frank

+0

вопрос в том, почему вы хотите это сделать? Почему бы просто не использовать 'margin.table'? – MichaelChirico

+0

@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

ответ

3

Как правило, вы можете цепью как DT[...][...]. В случае OP:

DT[,xy := x/y][, 
    c(name = "Total", lapply(.SD, sum), xy = mean(xy)), .SDcols=x:z][, 
    rbind(DT, .SD)] 

Однако это очень хрупкая конструкция и трудно работать для редактирования или отладки.

Я бы, по крайней мере разбить его на ...

DT[,xy := x/y] 
DT[, 
    c(name = "Total", lapply(.SD, sum), xy = mean(xy)), .SDcols=x:z][, 
    rbind(DT, .SD)] 

Я думаю, что стоит отметить, что добавление строки итога, как это обычно контрпродуктивным, если вы не сделали работы с данными и хотите напечатать или просмотреть его.

+0

Я сделал небольшое дополнение к моему оригинальному вопросу - потому что это работает для одной переменной, но мне интересно, можно ли применить свой ответ к нескольким суммарным функциям в нескольких блоках '.SDcol'? – gscott

+0

@gscott Nope. вероятно, make '.SDcols' состоят из объединенного набора, а затем выполните' c (lapply (.SD [, 1: 3], sum), lapply (.SD [, 4: 6], среднее значение)) 'или подобное, хотя , – Frank