2013-08-20 9 views
5

के लिए वेक्टर स्कैन और बाइनरी खोज के बीच भिन्न हैं यह डेटा.table परिचय में उदाहरणों से है। देखें http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdfडेटाटेबल परिणाम गायब डेटा

उदाहरण इस बात पर जाते हैं कि एक बाइनरी खोज एक वेक्टर स्कैन से तेज है और बिल्कुल उसी परिणाम का उत्पादन करती है (पृष्ठ 5 देखें)। तो यहां मेरा उदाहरण है:

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")] 

जैसा कि उम्मीद है कि यह वास्तव में एक ही परिणाम देता है। एक हर पंक्ति स्कैन करता है, दूसरा बाइनरी खोज है। हालांकि, जब ऐसी पंक्तियां मौजूद हैं जो मौजूद नहीं हैं तो परिणाम अलग-अलग हैं। निम्नलिखित कोड देखें:

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

मैं निम्नलिखित परिणाम

# > 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 

क) क्यों यह मामला है।?

बी।) क्या बाइनरी खोज के व्यवहार को बदलने के लिए कोई मौजूदा तरीका नहीं है ताकि मौजूदा पंक्तियों के नतीजे न लौटे?

+4

मुझे लगता है कि 'जे' सिर्फ एक बाइनरी खोज से अधिक है; यह एक "शामिल है।" प्रत्येक कुंजी संयोजन के लिए यह दिया जाता है, इसे कुछ वापस करना पड़ता है। इसे बंद करने के लिए: 'डीटी [जे (' आर ',' एच '), नामांकन = 0] ' – Frank

+1

@ फ्रैंक, आपको इसे एक जवाब देना चाहिए। – Arun

उत्तर

10

मुझे लगता है कि जे सिर्फ एक बाइनरी खोज से अधिक है; यह एक "शामिल है।" प्रत्येक कुंजी संयोजन के लिए यह दिया जाता है, इसे कुछ वापस करना पड़ता है। इसे बंद करने के लिए:

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

यदि यह मदद करता है, तो दस्तावेज़ ओपी के पृष्ठ 6 में इस "शामिल" अवधारणा के बारे में वार्ता का संदर्भ दिया गया है। – Arun

संबंधित मुद्दे