使用变量在R中添加数据框列

时间:2014-01-29 02:29:52

标签: r variables substitution

我正在努力实现以下目标

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

有什么想法吗?

提前致谢

3 个答案:

答案 0 :(得分:1)

这是一种更简单的方法

do.call('cbind', lapply(mget(stocks), function(d) d[,6]))

说明:

  1. mget(stocks)将三个数据框作为列表
  2. lapply提取包含感兴趣变量的第6列。
  3. do.call将列表从(2)传递给cbind,将它们作为列绑定在一起。
  4. 注意:此解决方案不会处理数据框中不同数量的列。

答案 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函数。