आर

2013-09-05 5 views
6

में वीएलूकअप प्रकार विधि मेरे पास विभिन्न भावी अनुबंधों के लिए हजारों टिकर्स के साथ एक डीएफ है। वे संक्षिप्त नाम (जो बाद में दिखाई देता है) और लंबे समय नाम (जो मैं अन्य df में करना चाहते हैं)आर

full_list <- structure(
    list(
    Ticker = c("AC", "AIC", "BBS", "BO", "C", "DF"), 
    Long_Name = c("Ethanol -- CBOT", "DJ UBS Commodity Index -- CBOT", "South American Soybeans -- CBOT", "Soybean Oil -- CBT", "Corn -- CBT", "Dow Jones Industrial Average -- CBT") 
), 
    .Names = c("Ticker", "Long_Name"), 
    row.names = c(NA, 6L), 
    class = "data.frame" 
) 

यह df सूची है कि मैं दैनिक प्राप्त है की है। मुझे संक्षिप्त नाम जाना है और इसे लंबे नाम से मिलान करना है।

replace <- structure(
    list(
    Type = c("F", "F", "F", "F", "F", "F"), 
    Location = c("US", "US", "US", "US", "US", "US"), 
    Symbol = c("BO", "C", "DF", "AIC", "AC", "BBS"), 
    Month = c("V13", "U13", "U13", "U13", "U13", "U13") 
), 
    .Names = c("Type", "Location", "Symbol", "Month"), 
    row.names = c(NA, 6L), 
    class = "data.frame" 
) 

मुझे क्या करना आर रहा हूँ $ प्रतीक स्तंभ की जगह लेने के लिए और full_list $ टिकर कॉलम में उन मूल्यों को खोजने के लिए और एक स्तंभ जोड़ने के लिए, $ की जगह Long_Name, जहां संबंधित full_list $ Long_Name पर कॉपी किया जाता है। उम्मीद है कि यह समझ में आता है। मैं समझता हूं कि कॉलम नामों का पालन करना मुश्किल है।

यह एक्सेल में एक आसान VLOOKUP होगा, लेकिन मैं एक स्क्रिप्ट मैं एक दैनिक आधार लगभग आर में पूरा पर प्रयोग करेंगे

उत्तर

16

merge उन्हें:

> merge(full_list, replace, by.x="Ticker", by.y="Symbol") 
    Ticker       Long_Name Type Location Month 
1  AC      Ethanol -- CBOT F  US U13 
2 AIC  DJ UBS Commodity Index -- CBOT F  US U13 
3 BBS  South American Soybeans -- CBOT F  US U13 
4  BO     Soybean Oil -- CBT F  US V13 
5  C       Corn -- CBT F  US U13 
6  DF Dow Jones Industrial Average -- CBT F  US U13 
+0

क्या यह विधि काम करेगी यदि डुप्लिकेट "टिकर्स" हैं? क्या यह एक बार से अधिक "long_name" का उपयोग करेगा। – Tim

+0

@Tim: हां: 'विलय (पूर्ण_सूची, rbind (प्रतिस्थापन, परिवर्तन (प्रतिस्थापन, महीना =" Z13 ")), by.x =" टिकर ", by.y =" प्रतीक ")'। –

8

आप match इस्तेमाल कर सकते हैं - जो देता है दूसरी तर्क में पहली तर्क कहां से सूचकांक है। उदाहरण के लिए:

arg1 <- c("red","blue") 
arg2 <- c("blue","red") 

> match(arg1,arg2) 
[1] 2 1 

तो बस अपने को बदलने के डेटा फ्रेम में एक नया स्तंभ बनाने (नोट - और आप इसे कॉल करना चाहिए कुछ है, क्योंकि की जगह आर में एक समारोह है वास्तव में) मेल खाने वाले प्रतीकों के साथ full_list डेटा फ्रेम का उपयोग कर। ,

library(qdap) 
replace$Long_Name <- lookup(replace$Symbol, full_list) 

## > replace 
## Type Location Symbol Month       Long_Name 
## 1 F  US  BO V13     Soybean Oil -- CBT 
## 2 F  US  C U13       Corn -- CBT 
## 3 F  US  DF U13 Dow Jones Industrial Average -- CBT 
## 4 F  US AIC U13  DJ UBS Commodity Index -- CBOT 
## 5 F  US  AC U13      Ethanol -- CBOT 
## 6 F  US BBS U13  South American Soybeans -- CBOT 
+0

क्या दो मानदंडों पर मिलान करना संभव है? जैसे कि 'Long_Name' वर्ष के अनुसार भिन्न होता है, क्या' मिलान 'में '$ वर्ष' तर्क जोड़ना संभव है? –

+1

@ राफेलमार्टिन्स मैं 'data.table' पैकेज को देखता हूं। आप मल्टी-कॉलम कुंजियों पर विलय कर सकते हैं जो कि आसान और बहुत ही कुशल है। आप 'विलय' का उपयोग भी कर सकते हैं और कॉलम नामों के वेक्टर को 'बाय' पैरामीटर में आपूर्ति कर सकते हैं। देखें: http://stackoverflow.com/questions/6709151/how-do-i-combine-two-data-frames-based-on-two-columns – dayne

6

तो यह एक बड़ा डेटा आप एक वातावरण देखने से लाभ हो सकता सेट मामला है, इस प्रयास करें:

require(plyr) 

colnames(replace)<-c("Type", "Location", "Ticker", "Month") 

Full<-join(full_list, replace, by = "Ticker", type = "left", match = "all") 

> Full 
    Ticker       Long_Name Type Location Month 
1  AC      Ethanol -- CBOT F  US U13 
2 AIC  DJ UBS Commodity Index -- CBOT F  US U13 
3 BBS  South American Soybeans -- CBOT F  US U13 
4  BO     Soybean Oil -- CBT F  US V13 
5  C       Corn -- CBT F  US U13 
6  DF Dow Jones Industrial Average -- CBT F  US U13 

इसकी एक एक पंक्ति समाधान सिर्फ अधिक से अधिक है, मर्ज कुछ समय बड़ा dataframes साथ कार्रवाई करने के लिए ले जा सकते हैं। इसके अलावा, प्लीयर पैकेज आपका सबसे अच्छा दोस्त हो सकता है।

1

आप एक बड़े डेटा सेट का उपयोग कर रहे हैं, तो आप कुछ समय/स्मृति में समस्याएं आ रही हो सकता है अगर वह है:

replace$Long_Name <- full_list$Long_Name[match(replace$Symbol,full_list$Ticker)] 

> replace 
    Type Location Symbol Month       Long_Name 
1 F  US  BO V13     Soybean Oil -- CBT 
2 F  US  C U13       Corn -- CBT 
3 F  US  DF U13 Dow Jones Industrial Average -- CBT 
4 F  US AIC U13  DJ UBS Commodity Index -- CBOT 
5 F  US  AC U13      Ethanol -- CBOT 
6 F  US BBS U13  South American Soybeans -- CBOT 
5

अनिवार्य data.table जवाब

library(data.table) 
full_list <- data.table(full_list, key='Symbol') 
replace <- data.table(replace, key='Ticker') 

replace[full_list] 

FWIW एक डेटा 1E5 पंक्तियों के बारे में ऊपर सेट पर एक keyed data.table काफी तेजी सूचीबद्ध (qdap संस्करण के अलावा अन्य तरीकों से हो जाएगा, मैं प्रयास नहीं किया है कि)। merge timings can be found here