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

时间:2017-02-21 20:51:35

标签: r data.table summary

正如标题所说 - 我有以下样式数据:

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函数来实现这一目标?

1 个答案:

答案 0 :(得分: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)]

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