如何使用R中的getSymbols处理雅虎财务代码中的破折号?

时间:2017-12-17 04:29:44

标签: r quantmod

很少了解R.尝试调整一些代码来完成任务。 然而,在自动收报机中遇到了破折号。

symbol.vec=c("BTC-USD","ETH-USD")
getSymbols(symbol.vec,from="2015-08-07",to="2017-12-16")

BTC = BTC-USD[,"BTC-USD.Adjusted",drop=F]
  

错误:找不到对象'USD'

显然,破折号被视为减号。 如何更改数据框的名称以便我可以引用它们?

1 个答案:

答案 0 :(得分:2)

D对象在R对象或列名称中不合法。为避免错误,您需要将非法名称括在反引号中。如果您执行以下操作,您的代码将起作用:

BTC = `BTC-USD`[ , "BTC-USD.Adjusted", drop=F]

引号将用于索引大括号内部,因此只需要在反引号中包含对象的引用。但是,要使用美元符号表示法,您还需要对列名称进行反引号,并提供这段令人憎恶的代码:

`BTC-USD`$`BTC-USD.Adjusted`

通常最好使用合法的列名称,并在输出到图表,表格等时仅更改为“真实世界”的名称。

作为新的R用户,更直观,更透明的方法是更改​​对象和列名称,可能只是为每个符号显式重命名数据。我们将从连字符切换到下划线,因为下划线是合法的:

# Change name of object to legal name
BTC_USD = `BTC-USD`

# Change column names to legal names
names(BTC_USD) = gsub("-", "_", names(BTC_USD))

更有效但不太直观和透明的方法是将数据放入列表并在列表中操作:

# Put data into a list; one symbol per list element
dat = mget(symbol.vec)

names(dat)
lapply(dat, head)
> names(dat)
[1] "BTC-USD" "ETH-USD"

> lapply(dat, head)
$`BTC-USD`
           BTC-USD.Open BTC-USD.High BTC-USD.Low BTC-USD.Close BTC-USD.Volume BTC-USD.Adjusted
2015-08-06       278.00       279.60      274.28        277.89       11919665           277.89
2015-08-07       277.89       278.92      257.42        258.60       22308123           258.60
2015-08-08       258.60       266.75      258.56        263.87       15154749           263.87
2015-08-09       263.87       266.63      260.52        263.30       12873441           263.30
2015-08-10       263.30       269.90      261.44        269.03       13681939           269.03
2015-08-11       269.03       271.50      263.66        267.66       15232934           267.66

$`ETH-USD`
           ETH-USD.Open ETH-USD.High ETH-USD.Low ETH-USD.Close ETH-USD.Volume ETH-USD.Adjusted
2015-08-06       0.6747         3.00      0.6747          3.00            371             3.00
2015-08-07       3.0000         3.00      0.1500          1.20           1438             1.20
2015-08-08       1.2000         1.20      1.2000          1.20              0             1.20
2015-08-09       1.2000         1.20      1.2000          1.20              0             1.20
2015-08-10       1.2000         1.20      0.6504          0.99           7419             0.99
2015-08-11       0.9900         1.29      0.9050          1.29           2376             1.29
# Rename list elements and columns to legal names
names(dat) = gsub("-", "_", names(dat))
dat = lapply(dat, function(x) setNames(x, gsub("-","_", names(x))))

names(dat)
lapply(dat, head)
> names(dat)
[1] "BTC_USD" "ETH_USD"

> lapply(dat, head)
$BTC_USD
           BTC_USD.Open BTC_USD.High BTC_USD.Low BTC_USD.Close BTC_USD.Volume BTC_USD.Adjusted
2015-08-06       278.00       279.60      274.28        277.89       11919665           277.89
2015-08-07       277.89       278.92      257.42        258.60       22308123           258.60
2015-08-08       258.60       266.75      258.56        263.87       15154749           263.87
2015-08-09       263.87       266.63      260.52        263.30       12873441           263.30
2015-08-10       263.30       269.90      261.44        269.03       13681939           269.03
2015-08-11       269.03       271.50      263.66        267.66       15232934           267.66

$ETH_USD
           ETH_USD.Open ETH_USD.High ETH_USD.Low ETH_USD.Close ETH_USD.Volume ETH_USD.Adjusted
2015-08-06       0.6747         3.00      0.6747          3.00            371             3.00
2015-08-07       3.0000         3.00      0.1500          1.20           1438             1.20
2015-08-08       1.2000         1.20      1.2000          1.20              0             1.20
2015-08-09       1.2000         1.20      1.2000          1.20              0             1.20
2015-08-10       1.2000         1.20      0.6504          0.99           7419             0.99
2015-08-11       0.9900         1.29      0.9050          1.29           2376             1.29