我正在努力实现以下目标
stocks <- c('AXP', 'VZ', 'V')
library('quantmod')
getSymbols(stocks)
上面的命令创建了3个名为AXP,VZ和V
的数据变量prices <- data.frame(stringAsFactors=FALSE)
这里我尝试创建一个名为ticket的列(例如AXP),其中包含数据 以下内容应在框架中添加3列,将数据命名为AXP,VZ和V. AXP $ AXP.Adjusted,VZ $ VZ.Adjusted,V $ V.Adjusted
for (ticker in stocks)
{
prices$ticker <- ticker$ticker.Adjusted
}
我如何实现这一目标?当我尝试这个时,R会给出这样的错误
Error in ticker$ticker.Adjusted :
$ operator is invalid for atomic vectors
有什么想法吗?
提前致谢
答案 0 :(得分:1)
这是一种更简单的方法
do.call('cbind', lapply(mget(stocks), function(d) d[,6]))
说明:
mget(stocks)
将三个数据框作为列表lapply
提取包含感兴趣变量的第6列。do.call
将列表从(2)传递给cbind
,将它们作为列绑定在一起。注意:此解决方案不会处理数据框中不同数量的列。
答案 1 :(得分:0)
我以前不明白你的问题,现在我觉得我理解你想要的东西:
您写的内容不起作用,因为对象ticker
是字符串。如果要获取以该字符串命名的对象,则必须评估已解析的文本。
试试这个:
for (ticker in stocks){
prices <- cbind(prices, eval(parse(text=ticker))[,paste0(ticker, ".", "Adjusted")])
}
这会给你:
An ‘xts’ object on 2007-01-03/2014-01-28 containing:
Data: num [1:1780, 1:4] 53.4 53 52.3 52.8 52.5 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "AXP.Adjusted" "AXP.Adjusted.1" "VZ.Adjusted" "V.Adjusted"
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
List of 2
$ src : chr "yahoo"
$ updated: POSIXct[1:1], format: "2014-01-29 01:06:51"
答案 2 :(得分:0)
您将遇到的一个问题是三次下载的行数不同,因此将它们全部绑定到一个数据框中将会失败。
下面的代码使用每个文件的最后1000行(最近的),并且不使用循环。
stocks <- c('AXP', 'VZ', 'V')
library('quantmod')
getSymbols(stocks)
prices=do.call(data.frame,
lapply(stocks,
function(s)tail(get(s)[,paste0(s,".Adjusted")],1000)))
colnames(prices)=stocks
head(prices)
# AXP VZ V
# 2010-02-08 34.70 21.72 80.58
# 2010-02-09 35.40 22.01 80.79
# 2010-02-10 35.60 22.10 81.27
# 2010-02-11 36.11 22.23 82.73
# 2010-02-12 36.23 22.15 82.38
# 2010-02-16 37.37 22.34 83.45
从内到外工作,s
是自动收报机(例如,"AXP"
); get(s)
返回具有该名称的对象,因此AXP
; get(s)[,paste0(s,".Adjusted")]
相当于AXP[,"AXP.Adjusted"]
; tail(...,1000)
返回...
的最后1000行。因此,当s =“AXP”时,该函数返回AXP$AXP.Adjusted
的最后1000行。
lapply(...)
将该函数应用于股票中的每个元素。
do.call(data.frame,...)
使用lapply(...)
返回的列列表调用data.frame函数。