在data.table中joininheritance范围

我在data.table 1.9.3,也许我错了,但我不记得之前预计以下。

我build立了2个data.tables,dta和dtb

> dta idx vala fdx 1: 1 2 a 2: 2 4 a 3: 3 6 b > dtb idx valb 1: 1 3 2: 4 6 > dput(x = dta) structure(list(idx = c(1, 2, 3), vala = c(2, 4, 6), fdx = c("a", "a", "b")), .Names = c("idx", "vala", "fdx"), row.names = c(NA, -3L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000000110788>, sorted = "idx") > dput(x = dtb) structure(list(idx = c(1, 4), valb = c(3, 6)), .Names = c("idx", "valb"), row.names = c(NA, -2L), class = c("data.table", "data.frame" ), .internal.selfref = <pointer: 0x0000000000110788>, sorted = "idx") 

关键是两种情况下的idx。

当然,下面的工作

 > dta[dtb, sum(valb)] [1] 9 

但是,这不

 > dta[dtb, sum(valb), by = fdx] Error in `[.data.table`(dta, dtb, sum(valb), by = fdx) : object 'valb' not found 

但是这样做

 > dta[dtb][, sum(valb), by = fdx] fdx V1 1: a 3 2: NA 6 

如果我们看到中间步骤

 > dta[dtb] idx vala fdx valb 1: 1 2 a 3 2: 4 NA NA 6 

我会预料到的

 dta[dtb, sum(valb), by = fdx] == dta[dtb][, sum(valb), by = fdx] 

我哪里错了?

只是一个猜测

 library(data.table) dta <- data.frame(idx=c(1,2,3), vala=c(2,4,6), fdx=c('a','a','b')) dta <- data.table(dta) dtb <- data.frame(idx=c(1,4), valb=c(3,6)) dtb <- data.table(dtb) setkey(dta,idx) setkey(dtb,idx) 

所以当你打电话

 dta[dtb, sum(valb)] 

这有点像打电话

 tmp <- dta[dtb] attach(tmp) sum(valb) detach(tmp) 

但是,如果你打电话

 dta[dtb, sum(valb), by=fdx] 

那有点像打电话

 tmp <- dta[dtb] # attach(tmp) : attach doesn't happen sum(valb) # detach(tmp) : detach doesn't happen 

该函数不知道如何处理额外的参数。 例如,这也会引发一个错误:

 dta[dtb, class(fdx), sum(valb)] 

但是,这工作

 dta[dtb][, sum(valb), by=fdx] 

这是有点像

 tmp <- dta[dtb] tmp[, sum(valb), by=fdx] 

就像我说的,这只是一个猜测,为什么函数可能不能按预期工作。