Подтвердить что ты не робот

Присоедините унаследованную область с помощью в data.table

Я на data.table 1.9.3, и, возможно, я ошибаюсь, но я не помню, чтобы как ожидалось ранее.

Я строю 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]

Где я ошибся?

4b9b3361

Ответ 1

Просто угадать

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]

Как я уже сказал, это просто предположение, почему функция может работать не так, как ожидалось.