2013-08-20 19 views
5

Đây là từ các ví dụ trong phần giới thiệu data.table. Xem http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdfkết quả dữ liệu có thể khác nhau giữa quét vector và tìm kiếm nhị phân cho dữ liệu bị thiếu

Ví dụ về việc tìm kiếm nhị phân nhanh hơn so với quét vectơ và cho kết quả chính xác giống nhau (xem trang 5). Vì vậy, đây là ví dụ của tôi:

library(data.table) 
grpsize = ceiling(10000/26^2) 
DF <- data.frame(x=rep(LETTERS,each=26*grpsize), y=rep(letters,each=grpsize),v=runif(grpsize*26^2), stringsAsFactors=FALSE) 
DT = data.table(DF) 
setkey(DT,x,y) 

DT[x=='R' & y=='h'] 
DT[J("R","h")] 

Như dự kiến ​​điều này sẽ trả về chính xác kết quả tương tự. Một quét mỗi hàng, khác là một tìm kiếm nhị phân. Tuy nhiên, khi có các hàng không tồn tại thì các kết quả khác nhau. Xem đoạn mã sau:

DT[x=='R' & y=='H'] 
DT[J("R","H")] 

tôi nhận được kết quả như sau

# > DT[x=='R' & y=='H', ] 
# Empty data.table (0 rows) of 3 cols: x,y,v 

# > DT[J("R","H")] 
# x y v 
# 1: R H NA 

a) Tại sao đây là trường hợp.?

b.) Có cách nào để thay đổi hành vi tìm kiếm nhị phân không trả lại kết quả của các hàng không tồn tại không?

+4

Tôi đoán 'J' không chỉ là tìm kiếm nhị phân; đó là "tham gia". Đối với mỗi tổ hợp phím nó được đưa ra, nó phải trả lại một cái gì đó. Để tắt nó: 'DT [J ('R', 'H'), nomatch = 0]' – Frank

+1

@Frank, bạn nên làm cho câu trả lời đó. – Arun

Trả lời

10

Tôi đoán J không chỉ là tìm kiếm nhị phân; đó là "tham gia". Đối với mỗi tổ hợp phím nó được đưa ra, nó phải trả lại một cái gì đó. Để tắt tính năng này:

DT[J('R','H'),nomatch=0] 
+1

Nếu nó giúp, trang 6 của tài liệu OP đề cập đến các cuộc đàm phán về khái niệm "tham gia" này. – Arun

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