2014-07-14 14 views
49

Tôi đang ở trên data.table 1.9.3 và có thể tôi sai, nhưng tôi không nhớ lại số sau đây để được mong đợi trước đó.Tham gia phạm vi được thừa kế bằng theo dữ liệu.tại

tôi xây dựng 2 data.tables, dta và 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") 

Điều quan trọng là idx trong cả hai trường hợp.

Các công trình sau đây, tất nhiên

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

Tuy nhiên điều này không

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

Nhưng điều này không

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

Nếu chúng ta thấy bước trung gian

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

tôi dự kiến ​​sẽ có

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

ở đâu tôi đi sai?

+6

Đã giải quyết vấn đề này là [FR # 733] (https://github.com/Rdatatable/data.table/issues/733). Ngoài ra nộp một [FR # 732] có liên quan (https://github.com/Rdatatable/data.table/issues/732). Cảm ơn. – Arun

+0

Tôi có thể tái tạo hành vi này (= lỗi?) Trong dữ liệu.table 1.9.4 quá, có bất kỳ tin tức nào không? –

Trả lời

1

Chỉ cần một đoá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) 

Vì vậy, khi bạn gọi

dta[dtb, sum(valb)] 

đó là loại giống như gọi

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

Tuy nhiên, nếu bạn gọi

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

thì đó là loại giống như gọi

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

Chức năng không biết phải làm gì với các đối số bổ sung. Ví dụ, điều này cũng sẽ ném ra một lỗi:

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

Tuy nhiên, hoạt động này

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

đó là loại giống như

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

Như tôi đã nói, đây chỉ là một phỏng đoán như tại sao hàm có thể không hoạt động như mong đợi.

Các vấn đề liên quan