8

我有一个包含数千个代码的 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 列中找到这些值并添加一个列 replace$Long_Name,其中相应的 full_list$Long_Name 被复制过来。希望这是有道理的。我知道列名很难理解。

这将是一个简单的 Excel 中的 VLookup,但我有一个脚本,我每天都会使用,几乎在 R 中完成。

4

5 回答 5

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
于 2013-09-05T20:26:19.190 回答
10

您可以使用match- 它给出第一个参数在第二个参数中的位置的索引。例如:

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

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

然后只需使用带有匹配符号的 full_list 数据框在您的替换数据框中创建一个新列(注意 - 您应该将其称为其他名称,因为替换实际上是 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
于 2013-09-05T20:26:29.000 回答
6

强制性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版本除外,我没有尝试过)。 合并时间可以在这里找到

于 2013-09-05T21:16:16.830 回答
6

如果它是一个大数据集,您可能会从环境查找中受益:

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
于 2013-09-05T20:33:33.037 回答
1

如果您使用的是大型数据集,您可能会遇到一些时间/内存问题,如果是这种情况,请尝试以下操作:

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

尽管它不仅仅是一个单一的解决方案,但合并可能需要一些时间来处理更大的数据帧。此外,plyr 包可以成为您最好的朋友。

于 2013-09-05T20:45:24.757 回答