2012-12-01 15 views
6

मैं एक data.table एक्स राशि वेक्टर खोज से बचने के लिए कैसे है कि मैं 2 चरित्र चरमें data.table

X[, varC :=((VarA =="A" & !is.na(VarA)) 
       | (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB)) 
       ) 
     ] 

इस कोड काम करता है के आधार पर एक चर बनाने के लिए करना चाहते हैं, लेकिन यह बहुत धीमी है, क्योंकि यह 2 चर चर पर वेक्टर स्कैन करता है। ध्यान दें कि मैं Vara और VarB द्वारा दावे 4 टेबल सेट नहीं करता हूं। क्या डेटाटेबल में ऐसा करने का कोई "सही" तरीका है?

अद्यतन 1: मैं इस परिवर्तन के लिए सेटकी का उपयोग नहीं करता क्योंकि मैं पहले से ही अन्य परिवर्तनीय परिवर्तनों के लिए सेटकी (एक्स, वर्ष, आईडी) का उपयोग करता हूं। यदि मैं करता हूं, तो मुझे इस परिवर्तन के बाद वर्ष, आईडी को रीसेट करने की आवश्यकता है।

अद्यतन 2: मैं बेंचमार्क मैथ्यू के दृष्टिकोण के साथ मेरी दृष्टिकोण किया था, और उसके बहुत तेजी से है:

  test replications elapsed relative user.self sys.self user.child sys.child 
2 Matthew    100 3.377 1.000  2.596 0.605   0   0 
1 vectorSearch   100 200.437 59.354 76.628 40.260   0   0 

केवल मामूली बात है setkey तो फिर से setkey फिर से कुछ हद तक वर्बोज़ है :)

+1

आप कुंजी सेट क्यों नहीं करते? –

+0

वहां कुछ अनावश्यक कोडिंग भी हो सकती है; उदाहरण के लिए यदि VarA == "एबी" सत्य है, तो यह हमेशा सत्य भी होगा! is.na (VarA), है ना? –

+0

हाय मार्क,! Is.na आवश्यक है। अन्यथा, अगर VarA गुम है, तो स्थिति VarA == "AB" 0 की बजाय NA वापस कर देगी क्योंकि मुझे – AdamNYC

उत्तर

6

कैसे के बारे में:

setkey(X,VarA,VarB) 
X[,varC:=FALSE] 
X["A",varC:=TRUE] 
X[J("A","AB"),varC:=TRUE] 

या, एक पंक्ति में (चर X की पुनरावृत्ति को बचाने के लिए और प्रदर्शित करने के लिए):

X[,varC:=FALSE]["A",varC:=TRUE][J("A","AB"),varC:=TRUE] 

, के रूप में अनुरोध कैसे के बारे में महत्वपूर्ण स्थापित करने से बचने के लिए एक मैनुअल माध्यमिक कुंजी:

S = setkey(X[,list(VarA,VarB,i=seq_len(.N))],VarA,VarB) 
X[,varC:=FALSE] 
X[S["A",i][[2]],varC:=TRUE] 
X[S[J("A","AB"),i][[3]],varC:=TRUE] 

अब स्पष्ट रूप से, कि वाक्य रचना बदसूरत है। तो FR#1007 Build in secondary keys इसे वाक्यविन्यास में बनाना है; उदाहरण के लिए,

set2key(X,varA,varB) 
X[...some way to specify which key to join to..., varC:=TRUE] 

इस बीच, ऊपर दिखाए गए अनुसार, मैन्युअल रूप से यह संभव है।

+0

हाय मैथ्यू का उपयोग करते हैं तो गणना को तेज करने के लिए आवश्यक है, कृपया यहां मेरे अपडेट को सेटकी से बचने के कारण के लिए देखें। लेकिन सेटकी हो सकती है फिर रीसेट कुंजी अभी भी वेक्टर खोज से तेज हो सकती है :) – AdamNYC

+0

ठीक है, मैं देखता हूं, फिर दूसरा विकल्प द्वितीयक कुंजी है। संपादित करेंगे ... –

+0

बहुत बहुत धन्यवाद, मैट। मैं आज कई नई चीजें सीखता हूं। set2key सुंदर होगा। अभी के लिए, मुझे लगता है कि कुंजी सेट और रीसेट करना, हालांकि कोड में दो और लाइन जोड़ना, पढ़ने में आसान है। इसने एक और (छोटा) डेटासेट नहीं बनाया (यानी, आपके उदाहरण में एस)। – AdamNYC

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