2013-02-21 16 views
8

से data.table में स्तंभ जोड़ने मैं आम कॉलम index1 & index2 द्वारा एक लुकअप तालिका के साथ मर्ज करके मेरी data.table में एक नया स्तंभ key बनाना चाहते हैं जो एक बेहतर तरीका की तलाश। तो फिर इस नए key स्तंभ (a, b, c) के मूल्यों से, मैं 3 नए कॉलम (a, b, c) कि data.table में value स्तंभ सूचकांक उत्पन्न करने के लिए करना चाहते हैं।लुकअप तालिका

इस तरह मेरे data.table दिखता है:

index1 index2 key 
1 1  1 a 
2 1  2 b 
3 2  1 a 
4 2  2 c 
5 3  1 c 
6 3  2 b 

अंतिम परिणाम इस तरह है::

index1  index2 value key  a  b  c 
1  2   0  0.00 NA  NA  NA  NA 
2  1   2 -5.00 b  NA -5.00  NA 
3  3   2 -5.00 b  NA -5.00  NA 
4  3   2 17.50 b  NA 17.50  NA 
5  2   2 15.00 c  NA  NA 15.00 
6  1   2 -7.50 b  NA -7.50  NA 
7  3   2  3.75 b  NA 3.75  NA 
8  1   2 -8.75 b  NA -8.75  NA 
9  2   1 15.00 a 15.00  NA  NA 
10  2   1 12.50 a 12.50  NA  NA 

मैं इसे सुलझाने की कोशिश की

index1  index2 value 
1  2   0  0.00 
2  1   2 -5.00 
3  3   2 -5.00 
4  3   2 17.50 
5  2   2 15.00 
6  1   2 -7.50 
7  3   2  3.75 
8  1   2 -8.75 
9  2   1 15.00 
10  2   1 12.50 

लुकअप तालिका यह है पहले डेटाटेबल और लुकअप टेबल को merge() पर विलय करके, फिर J() थ्रे का उपयोग किया गया उपर्युक्त परिणाम प्राप्त करने के लिए अलग समय। मैं डेटा.table के लिए काफी नया हूं, लेकिन कई बार प्रक्रिया को दोहराने के बजाय इसे हल करने के लिए एक और अधिक सुरुचिपूर्ण तरीका सीखना पसंद करूंगा।

DT <- merge(DT, lookup, by=c('index1', 'index2'), all.x=TRUE) 
DT <- data.table(DT) #Don't know why but DT became a data.frame after merge() 
DT[J("a"), a:=value] 
DT[J("b"), b:=value] 
DT[J("c"), c:=value] 
+1

मुझे अंतिम भाग नहीं मिलता है: 'मैं 3 नए कॉलम (ए, बी, सी) उत्पन्न करना चाहता हूं जो डेटाटेबल में मान को इंगित करता है) '। तुम्हारा क्या मतलब है? आपका अंतिम आउटपुट दिखा सकता है? आप 'NA' कुंजी को कैसे संभालना चाहते हैं? इसे किसी भी तरह से विलय करना 'एनए' बनाता है ... – Arun

+1

मेरी माफ़ी। कोड ब्लॉक को लेबल करने का तरीका जानने का प्रयास कर रहा था। अब यह पूरी तरह से संपादित है। – SeanM

+1

'विलय' का उपयोग न करें। इसके बजाय 'लुकअप [डीटी]' का उपयोग करें ('एक्स [वाई] 'वाक्यविन्यास)। आपको निश्चित रूप से ऐसा करने से पहले 'इंडेक्स 1, इंडेक्स 2' दोनों टेबल टेबल सेट करना चाहिए। – Arun

उत्तर

7

जब से तुम & index2 index1 पर शामिल करना चाहते हैं, तो आप merge उपयोग कर सकते हैं आप के रूप में या यदि आप अपने टेबल से प्रत्येक के लिए कुंजी के रूप में इन दें और इसके बाद आप बस [] शामिल होने के लिए उपयोग कर सकते हैं: यहाँ मेरी कोड है।

DT 
#  index1 index2 value a  b c 
# 1:  1  2 -5.00 NA -5.00 NA 
# 2:  1  2 -7.50 NA -7.50 NA 
# 3:  1  2 -8.75 NA -8.75 NA 
# 4:  2  0 0.00 NA NA NA 
# 5:  2  1 15.00 15.0 NA NA 
# 6:  2  1 12.50 12.5 NA NA 
# 7:  2  2 15.00 NA NA 15 
# 8:  3  2 -5.00 NA -5.00 NA 
# 9:  3  2 17.50 NA 17.50 NA 
# 10:  3  2 3.75 NA 3.75 NA 
: ( DT[lookup] में के रूप में)

setkey(lookup, index1, index2) 
setkey(DT, index1, index2) 

तो आप प्रत्येक अद्वितीय key पर अपने lookup मेज से इस प्रकार

keyVals <- unique(lookup[, key]) 

for (k in keyVals) 
    DT[lookup[key==k], c(k) := value] 



परिणाम पुनरावृति कर सकते हैं 10

+1

+1 'लुकअप [। (के)]' वेक्टर स्कैन '==' शायद। –

+0

'सी (के)' 'FALSE' से बचने के लिए अच्छा एलएचएस वाक्यविन्यास है। उस बारे में सोचा नहीं था! –

+1

@ एमडी धन्यवाद। मुझे 'एलएचएस' –

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