Unirse al alcance heredado con por en data.table
join (1)
Solo una suposición
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)
Entonces cuando llamas
dta[dtb, sum(valb)]
es como llamar
tmp <- dta[dtb]
attach(tmp)
sum(valb)
detach(tmp)
Sin embargo, si llamas
dta[dtb, sum(valb), by=fdx]
entonces es como llamar
tmp <- dta[dtb]
# attach(tmp) : attach doesn''t happen
sum(valb)
# detach(tmp) : detach doesn''t happen
La función no sabe qué hacer con los argumentos adicionales. Por ejemplo, esto también arrojaría un error:
dta[dtb, class(fdx), sum(valb)]
Sin embargo, esto funciona
dta[dtb][, sum(valb), by=fdx]
que es algo así como
tmp <- dta[dtb]
tmp[, sum(valb), by=fdx]
Como dije, esto es solo una suposición de por qué la función puede no funcionar como se esperaba.
Estoy en data.table 1.9.3, y tal vez estoy equivocado, pero no recuerdo lo que se esperaba anteriormente.
Construyo 2 data.tables, dta y 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")
La clave es idx en ambos casos.
Los siguientes trabajos, por supuesto
> dta[dtb, sum(valb)]
[1] 9
Sin embargo, esto no
> dta[dtb, sum(valb), by = fdx]
Error in `[.data.table`(dta, dtb, sum(valb), by = fdx) :
object ''valb'' not found
Pero esto no
> dta[dtb][, sum(valb), by = fdx]
fdx V1
1: a 3
2: NA 6
Si vemos el paso intermedio
> dta[dtb]
idx vala fdx valb
1: 1 2 a 3
2: 4 NA NA 6
Hubiera esperado
dta[dtb, sum(valb), by = fdx] == dta[dtb][, sum(valb), by = fdx]
¿Dónde me he equivocado?