2013-09-05 13 views
6

Ich habe eine df mit Tausenden von Tickern für verschiedene zukünftige Verträge. Sie haben die abgekürzten Namen und den langen Namen (die später erscheint) (die ich in anderen df haben will)VLookup Typ Verfahren in R

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

Dies df die Liste hat, die ich täglich erhalten. Ich muß den abgekürzten Namen gehen und Nachschlagen und es zu dem langen Namen entsprechen.

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

Was ich für R Suche zu tun, nehmen $ Spalte Symbol ersetzen und diese Werte in full_list $ Ticker Spalte und eine Spalte hinzufügen, ersetzen $ long_name, wo der jeweilige full_list $ long_name wird kopiert finden. Hoffe, das macht Sinn. Ich verstehe die Spaltennamen sind schwer zu folgen.

Dies wäre eine einfache VLookup in Excel, aber ich habe ein Skript, das ich auf einer täglichen Basis fast in R. abgeschlossen verwenden

Antwort

16

merge sie:

> 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

Wird diese Methode funktioniert, wenn es doppelte sind „Tickern“? wird es die „long_name“ mehr als einmal verwendet werden. – Tim

+0

@Tim: Ja: 'merge (full_list, rbind (ersetzen, transformieren (ersetzen, Month =" Z13 ")), by.x =" Ticker ", by.y =" Symbol ")'. –

8

Sie match verwenden könnte - was gibt der Index, wo das erste Argument in das zweite Argument fällt. Zum Beispiel:

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

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

Dann erstellen Sie einfach eine neue Spalte in dem Datenrahmen ersetzen (Hinweis - Sie sollten es noch etwas anderes nennen, ersetzen, da ist eigentlich eine Funktion in r) den full_list Datenrahmen mit den angepassten Symbolen.

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 
+0

Ist es möglich, auf zwei Kriterien übereinstimmen? Wie wenn 'Long_Name' von Jahr zu Jahr variiert, ist es möglich ein' $ year' Argument in 'match' hinzuzufügen? –

+1

@RafaelMartins Ich würde mir das Paket 'data.table' anschauen. Sie können auf mehrspaltigen Schlüssel tun Verschmelzung, die einfach und sehr effizient ist. Sie können auch 'merge' verwenden und den Parametern 'by' einen Vektor von Spaltennamen zuweisen. Siehe: http://stackoverflow.com/questions/6709151/how-do-i-combine-two-data-frames-based-on-zwei-columns – dayne

6

Wenn es ein großen Daten ist festgelegt Sie von einer Umgebung Lookup profitieren können:

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 
1

Wenn Sie eine große Datenmenge verwenden, Sie in einige Zeit/Speicherprobleme führen könnten, wenn das der Fall ist, versuchen Sie dies:

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 

Obwohl die mehr als nur eine eine Zeile Lösung, fusionieren kann einige Zeit dauern, mit größerem Datenrahmen zu verarbeiten. Auch das Plyr-Paket kann Ihr bester Freund sein.

5

Obligatorische data.table Antwort

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

replace[full_list] 

FWIW auf einem Datensatz über etwa 1e5 Reihen ein verkeilt data.table (mit Ausnahme der qdap Version aufgelistet deutlich schneller als die anderen Ansätze sein, habe ich nicht versucht, dass). merge timings can be found here