2014-09-01 11 views
7

के साथ एक data.table शामिल होने के लिए कैसे एक उदाहरण मामले यहाँ है:एकाधिक स्तंभों और एक से अधिक मान

DT = data.table(x=1:4, y=6:9, z=3:6) 
setkey(DT, x, y) 

जुड़ें कॉलम अधिक मान:

xc = c(1, 2, 4) 
yc = c(6, 9) 
DT[J(xc, yc), nomatch=0] 
    x y z 
1: 1 6 3 

J() रिटर्न केवल एकल पंक्ति का यह प्रयोग । असल में, मैं %in% ऑपरेटर के रूप में शामिल होना चाहता हूं।

DT[x %in% xc & y %in% yc] 
    x y z 
1: 1 6 3 
2: 4 9 6 

लेकिन %in% ऑपरेटर का उपयोग खोज एक सदिश स्कैन जो द्विआधारी खोज की तुलना में बहुत धीमी है बनाता है।

xc2 = rep(xc, length(yc)) 
yc2 = unlist(lapply(yc, rep, length(xc))) 
DT[J(xc2, yc2), nomatch=0] 
    x y z 
1: 1 6 3 
2: 4 9 6 

लेकिन इमारत XC2, इस तरह से yc2 कोड को पढ़ने के लिए कठिन बना देता है: आदेश द्विआधारी खोज करने के लिए, मैं में शामिल होने के मूल्यों के हर संभव संयोजन का निर्माण। इस मामले में %in% ऑपरेटर की बाइनरी खोज और सादगी की गति रखने का कोई बेहतर तरीका है?

+11

मुझे लगता है कि आप * क्रॉस जॉइन * की तलाश में हैं * - जो कार्य 'सीजे' है। 'डीटी [सीजे (एक्ससी, वाईसी), नामांकन = 0 एल] 'आज़माएं। इसे उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें (यदि सही है) और इसे स्वीकार करें। – Arun

उत्तर

1

डीटी टैग खुले प्रश्नों से इस प्रश्न को हटाने का उत्तर दें।
अरुण की टिप्पणी से कोड DT[CJ(xc,yc), nomatch=0L] नौकरी करेगा।

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