这完全取决于实施情况。然而,为什么不这样做呢?
dt[, .(vsum=sum(var), age=age[1]), by="id"]
编辑:下面的基准测试。
dt <- data.table(data.frame(
id = rep(1:10000, each=5),
age = rep(10*(1:10000), each=5),
var = rnorm(150000)
))
res1 <- function() {merge(dt[, .(vsum=sum(var)), by="id"], unique(dt[, c('id', 'age')]), by='id')}
res2 <- function() {dt[, .(vsum=sum(var)), by=c('id', 'age')]}
res3 <- function() {dt[, .(vsum=sum(var), age=unique(age)), by="id"]}
res4 <- function() {dt[, .(vsum=sum(var), age=age[1]), by="id"]}
library(microbenchmark)
microbenchmark(res1(),res2(), res3(), res4(), times=10)
Unit: milliseconds
expr min lq mean median uq max neval cld
res1() 6.940417 7.949203 9.250408 8.791923 9.695110 13.448288 10 b
res2() 3.796992 3.898165 4.889812 4.507141 4.790384 9.477044 10 a
res3() 48.259783 52.026664 55.401017 54.986112 59.375380 60.804102 10 c
res4() 2.646796 2.853593 3.709116 3.252362 3.391909 6.321708 10 a
因此,事实证明,与直觉相反,第二种方法相当快,最快的是第四种方法。