web-dev-qa-db-ja.com

RのVLookup型メソッド

私はさまざまな先物契約のために何千ものティッカーを備えたdfを持っています。それらには、省略名(後で表示されます)と長い名前(他の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"
)

私がRに求めているのは、replace $ Symbol列を取得し、full_list $ Ticker列でそれらの値を見つけて、それぞれのfull_list $ Long_Nameがコピーされる列replace $ Long_Nameを追加することです。これが理にかなっていることを願っています。列名を理解するのが難しいことを理解しています。

これはExcelでの簡単なVLookupですが、Rでほぼ完成した日常的に使用するスクリプトがあります。

8
Tim

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
16
Joshua Ulrich

matchを使用できます。これは、最初の引数が2番目の引数のどこにあるかのインデックスを示します。例えば:

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

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

次に、一致したシンボルを持つfull_listデータフレームを使用して、replaceデータフレームに新しい列を作成します(注-replaceは実際にはrの関数であるため、別の名前で呼び出す必要があります)。

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
9
dayne

ビッグデータセットの場合は、環境ルックアップの恩恵を受ける可能性があります。

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
6
Tyler Rinker

義務的data.table回答

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

replace[full_list]

約1e5行を超えるデータセットのFWIWは、キー付きdata.tableは、リストされている他のアプローチよりも大幅に高速になります(qdapバージョンを除いて、私はそれを試していません)。 マージのタイミングはここにあります

5
Justin

大規模なデータセットを使用している場合、時間/メモリの問題が発生する可能性があります。その場合は、次のことを試してください。

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

単なる1行のソリューションではありませんが、マージはより大きなデータフレームで処理するのに時間がかかる場合があります。また、plyrパッケージはあなたの親友になることができます。

1
Jellio