2013-09-05 16 views
6

Gelecekteki sözleşmeler için binlerce fişe sahip bir df var. Onlar bu df ben aldığınız günlük listesi vardırVLookup type yöntemi 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" 
) 

(sonradan görünür) kısaltılmış adı ve (ı diğer df olmasını istediğiniz) uzun isme sahip. Kısaltılmış adı arayıp uzun adıyla eşleştirmeliyim. Yapacak R Aradıklarım

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

ilgili full_list $ Long_Name üzerine kopyalanır Long_Name $, Sembol sütununun yerini alıp full_list $ Ticker sütununda bu değerleri bulmak ve bir sütun eklemek, $ değiştirilir. Umarım bu mantıklıdır. Sütun isimlerinin takip edilmesi zor olduğunu anlıyorum.

Bu excel kolay DÜŞEYARA olurdu ama senaryo ben

cevap

16

merge onları neredeyse R. tamamlanan günlük olarak kullanacağı var:

> 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

Yinelenen "işaretçiler" varsa bu yöntem işe yarar mı? "long_name" kelimesini bir kereden fazla kullanacak mı? – Tim

+0

@Tim: Evet: 'birleştirme (full_list, rbind (değiştirin, değiştirin (değiştirin, Ay =" Z13 ")), by.x =" Ticker ", by.y =" Symbol ")'. –

8

Sen match kullanabilirsiniz - hangi verir İlk argümanın ikinci argümanda yer aldığı dizin. Örneğin: - eşleşti sembollerle full_list veri çerçevesini kullanarak (r bir fonksiyonu aslında değiştirmek, çünkü başka bunu çağırmalıdır şey notu)

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

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

Sonra sadece veri çerçevesi yerine yeni bir sütun oluşturun. buysa, büyük bir veri setini kullanıyorsanız

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

İki kriterle eşleştirmek mümkün mü? "Long_Name", yıllara göre değişmiş gibi, "eşleştirmede" $ yıllık bir argüman eklemek mümkün mü? –

+1

@RafaelMartins 'data.table' paketine bakardım. Kolay ve çok verimli çok sütunlu anahtarlarda birleştirme yapabilirsiniz. Ayrıca 'birleştirme' özelliğini kullanabilir ve 'by' parametrelerine sütun adlarının bir vektörünü sağlayabilirsiniz. Bakınız: http://stackoverflow.com/questions/6709151/how-do-i-combine-two-data-frames-based-on-two-columns – dayne

6

büyük veri bir ortam arama yararlanabilir ayarlamak dava, şunu deneyin: onun daha adil bir tek satır çözümü rağmen

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 

, daha büyük dataframes ile işlenmesi biraz zaman alabilir birleşir. Ayrıca, plyr paketi en iyi arkadaşınız olabilir.

1

, bazı zaman/bellek sorunlarla karşılaşma: Örneğin

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

Zorunlu data.table cevap anahtarlı data.table hızlı qdap sürümü hariç (listelenen diğer yaklaşımlara göre anlamlı olacak 1E5 sıralar yaklaşık yukarıda belirtilen bir veriye

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

replace[full_list] 

FWIW, bunu denemedim). merge timings can be found here