通过链而不是 rbindlist 追加 data.table 总计行?

Append data.table totals row through chain instead of 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[...][...]那样链接。在 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)]

我认为值得指出的是,添加这样的摘要行通常会适得其反,除非您处理完数据并想要打印或浏览它。