正如标题所说 - 我有以下样式数据:
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 :(得分: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)]
我认为值得指出的是,添加这样的摘要行通常会适得其反,除非您已完成数据处理并想要打印或浏览它。